ListViewに対するAPIによる項目追加
- 題名: ListViewに対するAPIによる項目追加
- 著者: t-soku
- 日時: 2011/07/05 17:58:57
- ID: 28728
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: ListViewに対するAPIによる項目追加
- 著者: Hongliang
- 日時: 2011/07/05 18:27:07
- ID: 28729
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: ListViewに対するAPIによる項目追加
- 著者: Azulean
- 日時: 2011/07/05 23:13:13
- ID: 28730
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: ListViewに対するAPIによる項目追加
- 著者: t-soku
- 日時: 2011/07/06 5:52:33
- ID: 28731
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.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 をクリックすると コメントしてある行で例外が発生します。