.NET Framework 2.0中为TreeView控件新增了一个事件:NodeMouseDoubleClick。
该事件在MSDN中的介绍:

当用户使用鼠标双击 TreeNode 时发生。

命名空间:System.Windows.Forms
程序集:System.Windows.Forms(在 system.windows.forms.dll 中)
语法
C#
public event TreeNodeMouseClickEventHandler NodeMouseDoubleClick

备注
此事件在用户使用鼠标双击树节点的任何部分时发生,包括指示节点是折叠还是展开的加号 (+) 和减号 (-)。
来看看TreeNodeMouseClickEventHandler的定义:
TreeNodeMouseClickEventHandler 委托
注意:此委托在 .NET Framework 2.0 版中是新增的。

表示将处理 TreeView 的 NodeMouseClick 和 NodeMouseDoubleClick 事件的方法。

命名空间:System.Windows.Forms
程序集:System.Windows.Forms(在 system.windows.forms.dll 中)

语法
C#
public delegate void TreeNodeMouseClickEventHandler (
Object sender,
TreeNodeMouseClickEventArgs e


参数
sender
事件源。

e
包含事件数据的 TreeNodeMouseClickEventArgs。
TreeNodeMouseClickEventHandler要处理单击和双击两个事件的委托,区分单击和双击的依据是TreeNodeMouseClickEventArgs类的Clicks属性,单击Clicks=1,双击Clicks=2。
TreeNodeMouseClickEventArgs类还有一个Node属性,用来获取被单击的节点。
DobuleClick其实是两次Click,理论上双击一个Node发生的两次Click都应该针对这个Node,但事实并非如此。问题在于双击Node会展开触发展开和折叠,还有自动滚动。
双击Node后,如果Node包含子节点,TreeView触发展开或折叠,如果无法在控件可见区域显示全部Node,还会自动设置滚动位置。事件处理的过程似乎是这样的:
1、第一次Click
2、第二次Click的MouseDown,触发展开或折叠,设置滚动位置
3、第二次Click的MouserUp,获取Click的Node,构造TreeNodeMouseClickEventArgs参数。获取Click的Node是根据MouseUp时的鼠标位置,而这时可能发生了滚动,鼠标位置指向的Node已不是第一次Click时点击的Node了。


所以,在NodeMouseDoubleClick事件的TreeNodeMouseClickEventArgs参数中,Node属性很可能不是DoubleClick的Node。在处理NodeMouseDoubleClick事件时,应该使用Treeview.SelectedNode而不使用e.Node。
该事件在MSDN中的介绍:

当用户使用鼠标双击 TreeNode 时发生。 
命名空间:System.Windows.Forms
程序集:System.Windows.Forms(在 system.windows.forms.dll 中)
语法
C#
public event TreeNodeMouseClickEventHandler NodeMouseDoubleClick
备注
此事件在用户使用鼠标双击树节点的任何部分时发生,包括指示节点是折叠还是展开的加号 (+) 和减号 (-)。
来看看TreeNodeMouseClickEventHandler的定义:
TreeNodeMouseClickEventHandler 委托
注意:此委托在 .NET Framework 2.0 版中是新增的。 
表示将处理 TreeView 的 NodeMouseClick 和 NodeMouseDoubleClick 事件的方法。 
命名空间:System.Windows.Forms
程序集:System.Windows.Forms(在 system.windows.forms.dll 中)
语法
C#
public delegate void TreeNodeMouseClickEventHandler (
Object sender,
TreeNodeMouseClickEventArgs e

参数
sender
事件源。
e
包含事件数据的 TreeNodeMouseClickEventArgs。TreeNodeMouseClickEventHandler要处理单击和双击两个事件的委托,区分单击和双击的依据是TreeNodeMouseClickEventArgs类的Clicks属性,单击Clicks=1,双击Clicks=2。
TreeNodeMouseClickEventArgs类还有一个Node属性,用来获取被单击的节点。
DobuleClick其实是两次Click,理论上双击一个Node发生的两次Click都应该针对这个Node,但事实并非如此。问题在于双击Node会展开触发展开和折叠,还有自动滚动。
双击Node后,如果Node包含子节点,TreeView触发展开或折叠,如果无法在控件可见区域显示全部Node,还会自动设置滚动位置。事件处理的过程似乎是这样的:
1、第一次Click
2、第二次Click的MouseDown,触发展开或折叠,设置滚动位置
3、第二次Click的MouserUp,获取Click的Node,构造TreeNodeMouseClickEventArgs参数。获取Click的Node是根据MouseUp时的鼠标位置,而这时可能发生了滚动,鼠标位置指向的Node已不是第一次Click时点击的Node了。


所以,在NodeMouseDoubleClick事件的TreeNodeMouseClickEventArgs参数中,Node属性很可能不是DoubleClick的Node。在处理NodeMouseDoubleClick事件时,应该使用Treeview.SelectedNode而不使用e.Node。
本文解析了.NET Framework 2.0中TreeView控件的NodeMouseDoubleClick事件工作原理及注意事项,详细介绍了如何通过TreeNodeMouseClickEventArgs区分单击与双击,并正确处理双击事件。

924

被折叠的 条评论
为什么被折叠?



