从 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 键并使用光标移动键来更改项目的焦点。
我正在尝试从 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 键并使用光标移动键来更改项目的焦点。