从CListCtrl检索当前列表项文本时出现问题

issue with retrieving current list item text from CListCtrl

本文关键字:文本 问题 列表 CListCtrl 检索      更新时间:2023-10-16

我正在尝试从CListCtrl检索所选列表项。第一个项目文本检索正确。稍后,当我选择"下一个"时,只检索上一个列表项文本。下面是当我从CListCtrl中选择一个项目时触发的事件方法。

示例场景

列表(m_RListCtrl)->项目1、项目2、项目3

第一次单击/选择项目2。m_EditBox中显示的项目2文本。接下来,我单击项目3。项目2仍然显示然后我单击项目1。项目3显示在编辑框中然后我单击项目2。将显示项目1。。。。。。。…

事件代码:

void CRTConfigDlg::OnLvnItemchangedRepoConfigList(NMHDR *pNMHDR, LRESULT *pResult)
{
    CString itemText = L"";
    itemText = m_RListCtrl.GetItemText(m_RListCtrl.GetSelectionMark(), 0);
    m_EditBox.SetWindowText(itemText);
    //UpdateWindow();
}

我甚至在MFC CListCtrl中尝试了以下从获取项目文本索引的解决方案。但问题仍然是一样的。

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

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

您需要遍历所选项目,如下所示:

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