|
アイテムにユーザデータを付加する
リストコントロールに挿入した特定のアイテムを識別するにはどうすればいいでしょうか。リストコントロールのアイテムはインデックスを指定して取得しますが、このインデックスは、リストに表示されている順番を表します。ソート順が変わったり、アイテムを挿入・削除したりすると、特定のアイテムのインデックスは変わってしまいます。
アイテムを識別するIDをカラムに追加すれば識別できますが、ユーザから見えてしまうのであまりスマートではないですよね。こういう場合は、ユーザデータを使います。リストのアイテムには4バイトのユーザデータ(パラメータ)を付加することができます。このデータは自由に使うことができます。これをアイテムを識別するIDとして使えばいいわけです。
ユーザデータは何に使ってもいいので、ここに構造体やクラスのポインタを入れれば、付加的なデータをいくつでもアイテムに持たせることができます。
では、実際に使ってみます。プロジェクトを作成して、次のようなダイアログを作りました。"追加"ボタンを押すと、リストに新しい行が追加され、"ID取得"ボタンを押すと、選択されているアイテムに固有のIDを表示します。

エディットボックスにはいつも通りDDX変数、ボタンにはBN_CLICKEDのイベントハンドラを追加しました。(これらの使い方については、ボタンの基本、エディットボックスの基本等を見てください。)
では、"追加"ボタンが押された時のイベントハンドラを実装します。
// "追加"ボタン押下
void CListCtrl2Dlg::OnBnClickedBtnAdd()
{
LVITEM lvi;
int index;
int err = 0;
UpdateData();
if (m_xvEditName.IsEmpty() || m_xvEditPrice.IsEmpty()) err = 1;
// 商品名
if (!err)
{
lvi.mask = LVIF_TEXT | LVIF_PARAM;
lvi.iItem = 0;
lvi.lParam = m_id++; // ID
lvi.iSubItem = 0;
lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(m_xvEditName));
if ((index = m_xcList.InsertItem(&lvi)) == -1) err = 1;
}
// 単価
if (!err)
{
lvi.mask = LVIF_TEXT;
lvi.iItem = index;
lvi.iSubItem = 1;
lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(m_xvEditPrice));
if (!m_xcList.SetItem(&lvi)) err = 1;
}
return;
}
|
ユーザデータ(パラメータ)を使うには、lvi.maskにLVIF_PARAMを追加します。そしてlvi.lParamにユーザデータを入れます。ここでは独自に用意したアイテムのIDを入れました。次は"ID取得"ボタンです。
// "ID取得"ボタン押下
void CListCtrl2Dlg::OnBnClickedBtnGet()
{
int index = -1;
CString str;
while ((index = m_xcList.GetNextItem
(index, LVNI_ALL | LVNI_SELECTED)) != -1)
{
str.Format(_T("のIDは%dです。"), m_xcList.GetItemData(index));
str = m_xcList.GetItemText(index, 0) +str;
MessageBox(str);
}
return;
}
|
アイテムのユーザデータを取得するには、CListCtrl::GetItemData()関数を使います。
| DWORD_PTR CListCtrl::GetItemData(int
nItem) const; |
| 説明: |
アイテムの固有データの取得 |
| 引数: |
nItem:アイテムのインデックス |
| 戻り値: |
アイテムの固有データ |
では、ビルドして実行してみます。アイテムを追加、選択して"ID取得"ボタンを押すと、アイテムに付加されたIDが表示されます。

|