秋枫

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
上个星期在使用TreeView的时候发现一个问题。假设TreeView中包含了多个根节点和子节点。如下图:
当在实例构造函数中或第一次使用他之前注册了TreeView.AfterSelect 事件,
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
下面为事件处理程序用来计算事件程序运行次数。
private int i = 0;
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
       i++;
       this.label1.Text = i.ToString();
}
(1).当第一次点击[节点1]时,i= 1;这个没有问题;如果第一次点击其他节点,比如[节点2]或[节点1.1],那i = 2,也就是选中一次节点产生了两个AfterSelect事件,对代码进行单步调试,发现第一次事件处理程序中的e.Node.Text值为”节点1”,也就是说第一次AfterSelect事件是由[节点1]产生(这里并没有点击该节点),而第二次的事件才是所想要的事件。
(2).针对这一点,笔者试着第一次点击节点前面的展开/折叠图标(+/-),无论点击的是不是第一个根节点,都会执行相当于选中了第一个根节点的事件。第一次调用this.treeView1.Select();函数时也会如此。
 
对于(1),在.net framework 2.0 beta2上测试了一下,已经没有发生两次事件的问题,那这是不是bug? 对于(2)笔者只是对自己提醒一下在不直接选择节点的情况下也会触发AfterSelect事件,在.net framework 2.0 beta2测试结果是一样的。
 
如果要写些效率高的程序,对于事件的重复触发本人觉得是需要考虑的问题。针对上面的现象,假设在窗体的左边放了一个Treeview表示目录,而右边有个DataGrid,用来根据左边的选择列出对应于目录的产品,如果连续触发两次事件,是不是很恼火,尤其是在数据量大的情况下更是如此。
posted on 2005-10-08 20:21  秋枫  阅读(754)  评论(0编辑  收藏  举报