从 CListCtrl 检索当前列表项文本的问题
Posted
技术标签:
【中文标题】从 CListCtrl 检索当前列表项文本的问题【英文标题】:issue with retrieving current list item text from CListCtrl 【发布时间】:2015-11-03 07:15:30 【问题描述】:我正在尝试从 CListCtrl 检索选定的列表项。第一项文本检索正确。稍后当我选择下一个时,只检索上一个列表项文本。下面是我从 CListCtrl 中选择项目时触发的事件方法。
示例场景
List(m_RListCtrl) -> Item1, Item2, Item3
我第一次单击/选择 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 的以下解决方案。但问题还是一样。
你能帮我知道,我哪里出错了吗?
【问题讨论】:
【参考方案1】:您需要像这样遍历选定的项目:
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
【讨论】:
在我的情况下只有一列,所以我猜我不需要 for 循环。无论如何,它现在可以工作了。谢谢【参考方案2】:You can also use the Itemchanged Notification but you have to keep in mind, that this event is triggered when an item is selected and deselected.
所以你需要检查物品的状态。
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 键并使用光标移动键即可更改项目的焦点。
【讨论】:
以上是关于从 CListCtrl 检索当前列表项文本的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ListControl(ListView) 中检索数据?
从 SharePoint 2010 中的不同网站集中检索列表项