我正在尝试从CListCtrl中检索所选的列表项。第一项文本检索正确。稍后当我选择下一个时,仅检索先前的列表项文本。下面是我从CListCtrl中选择项目时触发的事件方法。
列表(m_RListCtrl) - > Item1,Item2,Item3
我第一次点击/选择Item2。第2项文本显示在m_EditBox中。 接下来,我单击Item3。仍然显示Item2 然后我点击Item1。 Item3显示在编辑框中 然后我点击Item2。显示项目1。 ... ... ......
事件代码:
void CRTConfigDlg::OnLvnItemchangedRepoConfigList(NMHDR *pNMHDR, LRESULT *pResult)
{
CString itemText = L"";
itemText = m_RListCtrl.GetItemText(m_RListCtrl.GetSelectionMark(), 0);
m_EditBox.SetWindowText(itemText);
//UpdateWindow();
}
我甚至尝试过Get Index of Item Text in MFC CListCtrl的解决方案。但问题仍然存在。
你能帮助我知道我哪里出错吗?
答案 0 :(得分:2)
你需要迭代这样的选定项目:
int nColumns = m_RListCtrl.GetHeaderCtrl()->GetItemCount();
POSITION pos = m_RListCtrl.GetFirstSelectedItemPosition();
while (pos)
{
int nItem = m_RListCtrl.GetNextSelectedItem(pos);
for(int i=0; i<nColumns; i++)
{
CString sItem = m_RListCtrl.GetItemText(nItem, i);
// TO DO: do stuff with item text here
}
}
答案 1 :(得分:2)
您也可以使用Itemchanged Notification,但必须记住,当选择并取消选择某个项目时会触发此事件。
所以你需要检查项目状态。
void CAnyDialogClass::OnLvnItemchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// check if the items state changed to selected.
if ((pNMLV->uChanged & LVIF_STATE)!=0 &&
(pNMLV->uOldState & LVIS_SELECTED)==0 &&
(pNMLV->uNewState & LVIS_SELECTED)!=0)
{
// This item is selected now
...
更精确的是使用LVIS_FOCUSED。用户可以通过按住Ctrl键并使用光标移动键来更改项目的焦点。