DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ListViewに対するAPIによる項目追加

環境/言語:[XP Pro.SP3, C# VS2010 Express]
分類:[.NET]

OS:XP Pro. SP3, VS 2010 Express SP1 C# の環境です。

初めての投稿です。よろしくお願いいたします。
API(Sendmessage)を使用して、ListViewへ項目を追加しようとトライしていますが、完成していません。
状況:
1.データが一行存在する状態で、2行目に項目を追加します。このとき、画面上は2行目に追加しようとした内容が表示されます。
2.その後、追加した項目を参照に行くと「ArgumentOutOfRangeException」例外が発生します。
 その他、疑問として、追加前後で「ListView.Items.Count」を確認していますが、ListView上には追加しようとした内容が表示されているにもかかわらず、前後ともに「1」となっています。(このへんが、矛盾で例外が発生するのかな ?)
やりたいこと:
 表題のとおり、APIで矛盾なく項目追加すること。

以下に、状況が発生するコードを記述します。
誤り等のご指摘、助言等をよろしくお願いいたします。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Check
{
public partial class Form1 : Form
{
[DllImport("user32")]
private static extern IntPtr SendMessage(IntPtr hWnd,
Int32 Msg,
IntPtr wParam,
ref LV_ITEM lParam
);
[StructLayoutAttribute(LayoutKind.Sequential)]
public struct LV_ITEM
{
public UInt32 mask;
public Int32 iItem;
public Int32 iSubItem;
public UInt32 state;
public UInt32 stateMask;
[MarshalAs(UnmanagedType.LPTStr)]
public String pszText;
public Int32 cchTextMax;
public Int32 iImage;
public IntPtr lParam;
}
private const Int32 LVM_FIRST = 0x1000;
private const Int32 LVM_INSERTITEM = LVM_FIRST + 77;
private const Int32 LVIF_TEXT = 0x0001;

public Form1()
{
InitializeComponent();
}

private ListView LSV = null;
private void Form1_Load(object sender, EventArgs e)
{
LSV = new ListView();
LSV.Name = "Lsv";
LSV.View = View.Details;
LSV.Size = new Size(200, 100);
LSV.Location = new Point(0, 0);
this.Controls.Add(LSV);
LSV.Columns.Add("ID", 60);
LSV.Items.Add("001");
}

private void button1_Click(object sender, EventArgs e)
{
Debug.Print("Item数 = {0} 件", LSV.Items.Count);

LV_ITEM LV = new LV_ITEM();
LV.mask = LVIF_TEXT;
LV.iItem = 1;
LV.iSubItem = 0;
LV.pszText = "005";
IntPtr rtn = SendMessage(LSV.Handle, LVM_INSERTITEM, (IntPtr)1, ref LV);

Debug.Print("結果 = {0}", rtn);
Debug.Print("Item数 = {0} 件", LSV.Items.Count);
}

private void button2_Click(object sender, EventArgs e)
{
string sM = string.Format("Item(index=1)の内容 = [{0}]", LSV.Items[1].Text); // **** 例外発生 **** //
MessageBox.Show(sM);
}
}
}
--------------------------
デバック結果:
Item数 = 1 件
結果 = 1
Item数 = 1 件
--------------------------
 Button1 で、項目を追加後、画面上は2行目に「005」が表示されています。
 その後、Button2 をクリックすると コメントしてある行で例外が発生します。
>  表題のとおり、APIで矛盾なく項目追加すること。
不可能です。
// その後の各要素へのアクセスを一切 Win32API でやるってのなら……それでも Dispose あたりで死ぬかな?
■No28728に返信(t-sokuさんの記事)
> API(Sendmessage)を使用して、ListViewへ項目を追加しようとトライしていますが、完成していません。

なぜこんなことをしようとしたかを気にしています。
単なる挑戦なのか、何らかの技術課題の解消のためなのか。
Hongliangさん
 ご回答ありがとうございます。
 不可能なのですね。
Azuleanさん
 挑戦してみようと思いましたが、不可能のようですね。

解決とします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板