简介: ListView控件常常会用到SelectedIndexChanged事件处理已选取的项目。
现在假设Items中有4个项目,并针对以下情况做说明。
简介: ListView控件常常会用到SelectedIndexChanged事件处理已选取的项目。
现在假设Items中有4个项目,并针对以下情况做说明。
情况1:
在毫无选取的状况下点击索引2项目,将会触发一次SelectedIndexChanged事件,接着在点击索引3的项目,则会触发两次SelectedIndexChanged事件。
这是第二次点击后,因为第一次已经选取索引2项目了,所以内部会先从索引0到索引3一个一个项目都做检查是否已选取,若已选取的话,则会取消已选取的项目,这时候就会触发SelectedIndexChanged事件,则这时SelectedIndices.Count的数量会等于0,最后内部在将第二次点击的索引3做为已选取状态,此时又会触发SelectedIndexChanged事件,所以总共是两次。
情况2:
先将所有项目都选取,之后点击索引1,这样则会触发3次SelectedIndexChanged事件。
与情况1个解相同原理,内部会先取消索引0选取,此时触发SelectedIndexChanged事件,在取消索引2的选取,此时再次触发SelectedIndexChanged事件,最后取消索引3的选取,触发SelectedIndexChanged事件,所以总共会触发三次。
实际应用的问题点: 假设使用者大量选取项目时,之后又只选取一项,可想而知会造成多次触发事件,若事件中写着大量更新的代码,则会造成效率上面的影响,应该避免这种情况。
简易的避免实践方式:
1: public partial class ListViewEx : ListView
2: {
3:
4: private bool isSelectedIndexChanged = false; // 记录当选取的索引改变时状态。
5: private bool canRaisingAnSelectedIndexChanged = false; // 记录是否可以调用SelectedIndexChanged事件。
6:
7:
8: protected override void OnClick(EventArgs e)
9: {
10: //
11: // 当选取索引有改变且目前有选取项目时,则触发OnSelectedIndexChanged方法。
12: //
13: if (isSelectedIndexChanged && this.SelectedIndices.Count != 0)
14: {
15: canRaisingAnSelectedIndexChanged = true;
16: OnSelectedIndexChanged(new EventArgs());
17: }
18:
19: base.OnClick(e);
20: }
21:
22: protected override void OnSelectedIndexChanged(EventArgs e)
23: {
24: //
25: // 当内部在取消选取索引时,可能会经过SelectedIndices.Count数量为0的时候,这时候应避免执行。
26: //
27: if (this.SelectedIndices.Count == 0) return;
28: //
29: // 最先被使用者点击则记录确认已选择索引已更变。
30: //
31: isSelectedIndexChanged = true;
32: //
33: // 等待内部取消索引完成后,透过比较后面触发的OnClick方法来执行OnSelectedIndexChanged方法。
34: //
35: if (!canRaisingAnSelectedIndexChanged) return;
36: //
37: // 避免使用者重新点击已选取项目,而执行OnClick方法让OnSelectedIndexChanged方法又执行一次。
38: //
39: isSelectedIndexChanged = false;
40: //
41: // 避免下次触发OnSelectedIndexChanged方法的初始设定。
42: //
43: canRaisingAnSelectedIndexChanged = false;
44: //
45: // 触发 SelectedIndexChanged 事件。
46: //
47: base.OnSelectedIndexChanged(e);
48: }
49: }
如此一来,每次选取项目时,SelectedIndexChanged事件只会被触发一次,这样可以避免SelectedIndexChanged事件里面的代码重复执行。
引用文章请注明出处与作者,谢谢。
作者: jGame
日期: 2011/09/11
原文:大专栏 ListView选取多项目后,选取单一项目的重复执行事件问题