如何防止触发由单个操作触发的同一类型的多个事件?
例如,我有ListView
包含一些项目。当我选择或取消选择所有项目时,SelectedIndexChanged
事件会针对每个项目触发一次。相反,我想收到一个事件指示用户的动作(选择/取消选择项目),无论项目数量。
有没有办法实现这个目标?
答案 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。对于用户的操作(选择/取消选择),此事件仅被触发一次。