【问题标题】:Is something like AfterSelectionChanged event exist for ListView?ListView 是否存在类似 After SelectionChanged 事件?
【发布时间】:2011-10-31 10:14:32
【问题描述】:

我在 ListView 中有一个项目列表,我需要类似 AfterSelectionChanged 事件。现在我订阅了 ItemSelectionChanged,但是如果我在包含 N 个项目的列表中按 Ctrl+A,它会被触发 N 次。但我只需要在所有项目都被选中后收到一次通知。

谢谢。

【问题讨论】:

  • 这是 WinForms 还是 WPF?
  • @MerlynMorgan-Graham: WinForms((

标签: c# winforms events listview multi-select


【解决方案1】:

您可以通过延迟方法调用直到所有 ItemSelectionChanged 事件停止触发来创建自己的方法。这由 Control.BeginInvoke() 非常干净地完成。让它看起来像这样:

    List<int> afterSelect = new List<int>();

    private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {            
        if (afterSelect.Count == 0) this.BeginInvoke(new Action(() => listView1_AfterSelectionChanged()));
        afterSelect.Add(e.ItemIndex);
    }

    private void listView1_AfterSelectionChanged() {
        // Use afterSelect
        //..
        afterSelect.Clear();
    }

如果您不需要跟踪更改了哪些项目,则可以使用布尔标志而不是 List。

【讨论】:

  • 谢谢,但你能解释一下它为什么有效吗?我的意思是事件处理的顺序和这个异步调用。您是否可以分享有关此主题的任何文章的链接?
  • @SKINDER 请注意,这仅在 UI 线程在项目选择之间没有处理任何消息时才有效。例如,如果您尝试手动选择所有项目(例如,在按住 CTRL 的同时单击它们,或者使用左键单击“套索”),listView1_AfterSelectionChanged 将在您选择所有项目之前执行。
  • 我不知道任何文章。这与在本机 UI 编程中使用 PostMessage 的方法完全相同。将消息添加到消息队列中,一旦 UI 线程再次空闲,就可以找到它。 Winforms本身也用到了,Form.Shown事件就是这样产生的。
【解决方案2】:
private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) {
    if (listView1.SelectedItems.Count == listView1.Items.Count) {
        // All items selected.
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多