防止事件从单个操作多次触发

时间:2009-07-02 08:44:00

标签: c# winforms events

如何防止触发由单个操作触发的同一类型的多个事件?

例如,我有ListView包含一些项目。当我选择或取消选择所有项目时,SelectedIndexChanged事件会针对每个项目触发一次。相反,我想收到一个事件指示用户的动作(选择/取消选择项目),无论项目数量。

有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:3)

您无法更改ListView代码,并且对其进行子类化不会提供很多选项。

我建议您只需在代码中添加一个小延迟(200毫秒或类似) - 即您只在上次更新后稍微进行计算。类似的东西:

using System;
using System.Windows.Forms;
static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        ListView list;
        TextBox txt;
        Timer tmr = new Timer();
        tmr.Interval = 200;
        Form form = new Form {
            Controls = {
                (txt = new TextBox { Dock = DockStyle.Fill, Multiline = true}),
                (list = new ListView { Dock = DockStyle.Right, View = View.List,
                   Items = { "abc", "def" , "ghi", "jkl", "mno" , "pqr"}})
            }
        };
        list.SelectedIndexChanged += delegate {
            tmr.Stop();
            tmr.Start();
        };
        tmr.Tick += delegate {
            tmr.Stop();
            txt.Text += "do work on " + list.SelectedItems.Count + " items"
                 + Environment.NewLine;
        };
        Application.Run(form);
    }
}

答案 1 :(得分:1)

只是从一个稍微不同的方向来解决问题。例如。订阅失去焦点。

最后,应用程序或运行时无法在“所有选择更改完成”上引发事件而不实际使用其他内容,因为应用程序无法预测用户是否会在控件保留时再次执行控件对焦。

即使使用焦点,用户也可以切换回该控件。

答案 2 :(得分:0)

如果ListView位于virtual mode,您可以使用 VirtualItemsSelectionRangeChanged event。对于用户的操作(选择/取消选择),此事件仅被触发一次。