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

时间:2015-11-03 07:15:30

标签: c++ mfc clistctrl

我正在尝试从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的解决方案。但问题仍然存在。

你能帮助我知道我哪里出错吗?

2 个答案:

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