MFC リストコントロール 行の削除 [PC]
珍しくプログラムのネタです。
今ちょっとMFCを使ったWindowsのプログラムを作成しています。
ダイアログにリストコントロールを配置してリスト上で選択した
行を削除する処理を実装しているところです。
リストコントロールの行すべてを削除するのであれば
BOOL DeleteAllItems();
で一発ですが選択行を削除するというメソッドは存在しません。
リストから1行削除するのであれば
BOOL DeleteItem(int nItem);
が使用できますが削除する行を指定する必要があります。
選択行のインデックスを取得するには
POSITION GetFirstSelectedItemPosition() const;
int GetNextSelectedItem(POSITION& pos) const;
を利用します、MSのサイトでは以下の様なサンプルが紹介されています。
POSITION pos = m_myListCtrl.GetFirstSelectedItemPosition();
if (pos == NULL)
{
TRACE(_T("No items were selected!\n"));
}
else
{
while (pos)
{
int nItem = m_myListCtrl.GetNextSelectedItem(pos);
TRACE(_T("Item %d was selected!\n"), nItem);
// ここに選択行の処理を書く
}
}
この例では、nitemがインデックスなので
m_myListCtr.DeleteItem(nitem);
を書けばいいような気がしますが、これは間違いです、ここで
行を削除してしまうとリストの状態が変化してしまいます(選択が1行で
あればこれでも消えます、そもそも1行で有ればwhileも不要ですね)。
結局、選択行をすべて消すためには、毎回GetFirstSelectedItemPositionを
呼び出す必要があるようです。
pList = (CListCtrl*)GetDlgItem(IDC_LIST);
POSITION pos = pList->GetFirstSelectedItemPosition();
while (pos)
{
int nLine = pList->GetNextSelectedItem(pos);
pList->DeleteItem(nLine);
pos = pList->GetFirstSelectedItemPosition();
}
こんな感じ。
今ちょっとMFCを使ったWindowsのプログラムを作成しています。
ダイアログにリストコントロールを配置してリスト上で選択した
行を削除する処理を実装しているところです。
リストコントロールの行すべてを削除するのであれば
BOOL DeleteAllItems();
で一発ですが選択行を削除するというメソッドは存在しません。
リストから1行削除するのであれば
BOOL DeleteItem(int nItem);
が使用できますが削除する行を指定する必要があります。
選択行のインデックスを取得するには
POSITION GetFirstSelectedItemPosition() const;
int GetNextSelectedItem(POSITION& pos) const;
を利用します、MSのサイトでは以下の様なサンプルが紹介されています。
POSITION pos = m_myListCtrl.GetFirstSelectedItemPosition();
if (pos == NULL)
{
TRACE(_T("No items were selected!\n"));
}
else
{
while (pos)
{
int nItem = m_myListCtrl.GetNextSelectedItem(pos);
TRACE(_T("Item %d was selected!\n"), nItem);
// ここに選択行の処理を書く
}
}
この例では、nitemがインデックスなので
m_myListCtr.DeleteItem(nitem);
を書けばいいような気がしますが、これは間違いです、ここで
行を削除してしまうとリストの状態が変化してしまいます(選択が1行で
あればこれでも消えます、そもそも1行で有ればwhileも不要ですね)。
結局、選択行をすべて消すためには、毎回GetFirstSelectedItemPositionを
呼び出す必要があるようです。
pList = (CListCtrl*)GetDlgItem(IDC_LIST);
POSITION pos = pList->GetFirstSelectedItemPosition();
while (pos)
{
int nLine = pList->GetNextSelectedItem(pos);
pList->DeleteItem(nLine);
pos = pList->GetFirstSelectedItemPosition();
}
こんな感じ。
2024-02-17 17:45
nice!(0)
コメント(0)
コメント 0