【问题标题】:'Selected items changed to deselected' event in WinForm list viewWinForm 列表视图中的“选定项目更改为取消选择”事件
【发布时间】:2025-12-30 06:00:17
【问题描述】:

Winform ListView 控件是否有这样的事件,当“所有选定项更改为取消选定”时触发?所以,当我在列表中有一些选定的项目并且所有更改都取消选择时(所以,现在我没有任何选定的项目)我应该捕捉一个事件。恐怕它没有内置事件(?)或者......?

【问题讨论】:

  • 它没有。就像它没有在选择所有奇数行时触发的事件一样。正如回答问题 ItemSelectionChanged 的​​人所提到的,这是执行此任务的最简单方法。你对简单的“if”语句有什么看法?

标签: .net winforms listview


【解决方案1】:

在 ItemSelectionChanged 上,检查 ListView 中是否有任何项目被选中:

listView1.ItemSelectionChanged += listView1_ItemSelectionChanged;

void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
    if (listView1.SelectedItems.Count == 0)
        //Do something
}

【讨论】:

  • 对我来说不是一个好的解决方案:它总是在您选择另一个列表项时触发,而不仅仅是当所有项目都被取消选择时。
  • 这就是 if 语句存在的原因...否则,请编写您自己的从 ListView 派生的控件,并带有一个事件,用于取消选择所有项目。但我想我给出的解决方案还是最简单的!
【解决方案2】:

您可以使用 SelectedIndexChanged 并在事件中检查是否所有项目都被取消选择,即..

    bool allDeselected = true;

    foreach (ListViewItem item in myListView.Items)
    {
        if (item.Selected)
        {
            allDeselected = false;
            break
        }
    }

【讨论】:

  • 对我来说不是一个好的解决方案:它总是在您选择另一个列表项时触发,而不仅仅是当所有项目都被取消选择时。
【解决方案3】:
   this.listView1.ItemSelectionChanged += this.HandleOnListViewItemSelectionChanged;

    private void HandleOnListViewItemSelectionChanged(Object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (e.IsSelected)
        {
            //do your selected work
        }
        else
        {
            //do your unselected work
            this.listView1.ItemSelectionChanged-= new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.listView1_ItemSelectionChanged);
        }
    }

【讨论】:

  • 谢谢。它不会触发,例如当通过单击表单上的另一个列表和类似情况取消选择项目时。
  • 我认为您不应该使用 e.IsSelected 因为如果您选择了三个项目并同时取消选择它们,则该事件会被触发 3 次..
  • @Abbas:感谢指出问题,我做了一些调整,我想还是不行