【发布时间】:2016-12-05 14:51:43
【问题描述】:
我有一个 clistctrl,它显示多个系统的多个数据。不同系统只能选择一项。
最初,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);
但在视图中我只能看到被点击的项目被选中。但还有其他项目我应该保持选中状态。
为什么它不能只做我正在以编程方式做的选择?
【问题讨论】:
-
我给这个评论,因为我无法验证这一点,我认为你需要做一个
SetItemState(index, 0, LVIS_SELECTED)来取消选择一行