其他分享
首页 > 其他分享> > ListView选取多项目后,选取单一项目的重复执行事件问题

ListView选取多项目后,选取单一项目的重复执行事件问题

作者:互联网

简介: 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选取多项目后,选取单一项目的重复执行事件问题




标签:触发,SelectedIndexChanged,项目,选取,索引,事件,ListView
来源: https://www.cnblogs.com/petewell/p/11452537.html