【问题标题】:Winforms, ListView - stages of selection changeWinforms,ListView - 选择变化的阶段
【发布时间】:2015-01-16 00:59:59
【问题描述】:

我想实现一个场景,该场景需要我知道用户是通过单击空白区域来选择项目还是取消选择所有内容。基本上,我需要选择第一项(始终存在)。应该可以选择不同的项目,但是一旦用户单击空白区域并且通常会删除选择时,它应该跳回第一个(默认)项目。

我尝试使用列表视图控件的选择更改事件,但这些事件是按顺序触发的,这不是很有帮助:首先,当前选定的项目失去了选择。然后有一个单独的事件表明选择了一个新项目。

问题是:当第一次触发 ItemSelectionChanged 事件以表示之前选择的项目不再被选择时,是否有可能知道该项目被取消选择是因为正在选择另一个项目还是因为什么都没有选择?

【问题讨论】:

  • 控件应该只获得一个输入事件(例如MouseDownKeyDown),即使您获得了多个SelectionChanged 事件。因此,您可以使用它来区分对应于单个用户输入的 SelectionChanged 事件组。如果您需要更具体的帮助,您可能应该展示一个最接近您想要的代码示例,解释它的作用,以及它与您想要发生的不同之处。见stackoverflow.com/help/mcve
  • 是的,我应该发布最接近我需要的解决方案,但老实说,我只有一个天真的直接尝试,它是在假设事件在新状态建立后触发一次的情况下编写的.我在尝试构建工作时很快将其删除,这就是原因。否则,你当然是对的。

标签: c# winforms listview


【解决方案1】:

试试这个,看看它是否能解决你的问题。我们移除事件回调以防止再次调用事件,应用我们的逻辑并重新分配回调。

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        listView1.ItemSelectionChanged -= listView1_ItemSelectionChanged;

        if (!e.IsSelected)
        {
            listView1.Items[0].Selected = true;
            listView1.Items[0].Focused = true;
        }
        else
        {
            listView1.Items[0].Selected = false;
            listView1.Items[e.ItemIndex].Selected = true;
        }

        listView1.ItemSelectionChanged += listView1_ItemSelectionChanged;
    }

【讨论】:

  • 谢谢。试过这个,但结果很奇怪。有时最终会选择两个项目。实际上,我不明白为什么,因为我采用了完全不同的解决方案(见下文),所以我没有进一步调查。
【解决方案2】:

感谢您的回答。

我以完全不同的方式解决了这个问题:在选择更改事件时,我启用了一个短计时器,当勾选时,它会检查 ListView 中是否存在选定的项目,如果没有,它会选择第一个。在任何情况下它都会自行禁用。似乎它对我有用,所以我停在那里。

【讨论】:

    【解决方案3】:

    这将记住以前的选择并保留它。 (我的项目需要它并在这里获得了一些帮助)。

        private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
        {
            int temp = 0;
            listView1.ItemSelectionChanged -= listView1_ItemSelectionChanged;
            if (!e.IsSelected)
            {
                temp = e.ItemIndex;
                listView1.Items[temp].Selected = true;
                listView1.Items[temp].Focused = true;
            }
            else
            {
                for (int y = listView1.Items.Count - 1; y >= 0; y--)
                {
                    listView1.Items[y].Selected = false;
                }
                listView1.Items[e.ItemIndex].Selected = true;
            }
            listView1.ItemSelectionChanged += listView1_ItemSelectionChanged;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 2020-12-09
      • 2010-11-18
      • 1970-01-01
      • 2010-10-12
      相关资源
      最近更新 更多