我有一个clistctrl,显示多个系统的多个数据。只有1个项目可以选择不同的系统。
最初,clistctrl会加载从不同系统的控件中选择的第一个项目。
但是当我在更改模型中的数据并设置选择后,通过单击网格上的项目来更改选择时,它不会从我的数据结构中显示选择。相反,它只显示所选的点击行。 注意::我的数据结构具有正确的值,并且设置选择正确执行。我在选择前进行取消选择。 选择取消选择方法:
void SelectRow(int index)
{
SetFocus();
EnsureVisible(index, FALSE);
SetItemState(index, LVIS_SELECTED, LVIS_SELECTED);
}
void DeselectRow(int index)
{
SetItemState(index, ~LVIS_SELECTED, LVIS_SELECTED);
}
点击时的Afx消息:
void MDialog::OnSelectedItemChanged(NMHDR* pNMHDR, LRESULT*pResult)
{
UpdateData(FALSE);
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
switch (pNMListView->hdr.code)
{
case LVN_ITEMCHANGED:
{
(pNMListView->uNewState & LVIS_SELECTED)
if (!m_lockSelection && (pNMListView->uChanged & LVIF_STATE))
{
m_lockSelection = true;
FINALLY([=] {
m_lockSelection = false;
});
m_allPositionsView.ViewModel().Update(ntype::selection, pNMListView->iItem);
}
}
break;
}
UpdateData(TRUE);
}
最后我选择的通知事件:
void MDialog::OnRefinedProgramViewModelNotify(const MyProject::abc::ntype& notifyId)
{
for (int i = 0; i < int(m_allPositionsView.ViewModel().Model().Count()); ++i)
{
if (m_allPositionsView.ViewModel().Model().At(i).IsSelectedPosition())
{
m_allPositionsView.SelectRow(i);
}
}
}
程序正在正确执行选择方法。
m_allPositionsView.SelectRow(i);
但在视图中我只能看到所选的点击项目。但我还有其他项目可供选择。
为什么我只能以编程方式进行选择?
答案 0 :(得分:0)
要取消选择index
行,请使用以下代码:
UINT nState = GetItemState(index, LVIS_SELECTED);
nState &= ~LVIS_SELECTED;
SetItemState(index, nState, LVIS_SELECTED);
选择index
行使用:
SetItemState(index, LVIS_SELECTED, LVIS_SELECTED);