【问题标题】:clistctrl selection programmatically以编程方式选择 clistctrl
【发布时间】: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) 来取消选择一行

标签: c++ mfc


【解决方案1】:

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

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

要选择index 行,请使用:

      SetItemState(index, LVIS_SELECTED, LVIS_SELECTED);

【讨论】:

  • “您不必使用LVIS_FOCUSED,但我建议使用它,因为这样看起来更好” - 好不好,这是错误的。现在,您在对话框中有两个元素似乎已获得焦点。 LVIS_FOCUSED实际上只对执行自定义绘图时确定项目状态有用。
  • 感谢@IInspectable 的评论。我已经删除了 LVIS_FOCUSED
猜你喜欢
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2012-11-28
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多