C++ 以编程方式选择clistctrl

C++ 以编程方式选择clistctrl,c++,mfc,C++,Mfc,我有一个clistctrl,它显示多个系统的多个数据。不同系统只能选择一个项目 最初,clistctrl加载时,从不同系统的控件中选择第一项 但是,当我在更改模型中的数据并设置选择后,通过单击网格上的项目来更改选择时,它不会显示来自数据结构的选择。相反,它只显示选中的单击行。 注意:我的数据结构具有正确的值,设置选择正在正确执行。我在选择前取消选择。 选择取消选择方法: void SelectRow(int index) { SetFocus(); Ensur

我有一个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);
                    }
    }
}
但在视图中,我只能看到选中的单击项。但还有其他一些项目我希望保持选中状态


为什么它不能以编程方式执行我正在执行的选择?

要取消选择
索引
行,请使用以下代码:

      UINT nState = GetItemState(index, LVIS_SELECTED);
      nState &= ~LVIS_SELECTED;
      SetItemState(index, nState, LVIS_SELECTED);
要选择
索引
行,请使用:

      SetItemState(index, LVIS_SELECTED, LVIS_SELECTED);

我给这条评论,因为我无法验证这一点,我认为你需要做一个
SetItemState(index,0,LVIS_SELECTED)
来取消选择一行“你不必使用
LVIS_FOCUSED
,但我建议使用它,因为这样看起来更好”-无论是好是坏,都是错误的。现在,对话框中有两个元素看起来是焦点
LVIS_FOCUSED
仅在执行自定义绘图时用于确定项目状态。感谢@IInspectable的评论。我已经移除了LVI_
      SetItemState(index, LVIS_SELECTED, LVIS_SELECTED);