从 CListCtrl 检索当前列表项文本的问题

issue with retrieving current list item text from CListCtrl

我正在尝试从 CListCtrl 中检索 selected 列表项。第一项文本检索正确。稍后当我下一步 select 时,只检索到以前的列表项文本。下面是我 select 来自 CListCtrl 的项目时触发的事件方法。

示例场景

列表(m_RListCtrl) -> Item1, Item2, Item3

我第一次click/select Item2。 m_EditBox 中显示的 Item2 文本。 接下来我单击 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 中的解决方案。但是问题还是一样。

你能帮我知道我哪里错了吗?

您需要像这样遍历所选项目:

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
    }
}

您也可以使用 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 键并使用光标移动键来更改项目的焦点。