以编程方式选择clistctrl

时间:2016-07-31 11:11:37

标签: c++ mfc

我有一个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);

但在视图中我只能看到所选的点击项目。但我还有其他项目可供选择。

为什么我只能以编程方式进行选择?

1 个答案:

答案 0 :(得分:0)

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

      UINT nState = GetItemState(index, LVIS_SELECTED);
      nState &= ~LVIS_SELECTED;
      SetItemState(index, nState, LVIS_SELECTED);

选择index行使用:

      SetItemState(index, LVIS_SELECTED, LVIS_SELECTED);