[英]Prevent events from firing multiple times from single action
如何防止由单个操作触发的同一类型的多个事件的触发?
例如,我有一个包含一些项目的ListView
。 当我选择或取消选择所有项目时,为每个项目触发一次SelectedIndexChanged
事件。 相反,我想收到一个事件指示用户的动作(选择/取消选择项目),而不管项目的数量。
有没有办法实现这个目标?
您无法更改ListView
代码,并且子类化它不提供许多选项。
我建议您只需在代码中添加一个小延迟(200ms或类似) - 即您只在上次更新后稍微进行计算。 就像是:
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);
}
}
只是从一个稍微不同的方向来解决问题。 例如订阅失去焦点。
最后,应用程序或运行时无法在“完成所有选择更改”的情况下引发事件而不实际使用其他内容,因为应用程序无法预测用户是否会在保留焦点时对控件执行另一次单击。
即使使用焦点,用户也可以切换回该控件。
如果ListView
处于虚拟模式 ,则可以使用VirtualItemsSelectionRangeChanged
事件 。 对于用户的操作(选择/解除选择),此事件仅被触发一次。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.