c# - .NET Treeview NodeMouseClick 事件有滞后?
问题描述
我有这个代码:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (treeView1.SelectedNode.Nodes.Count == 0)
{
MessageBox.Show("The node does not have any children.");
}
}
单击没有子节点的 treeView 节点时,事件触发似乎存在延迟。
例如:
- 我单击带有子节点的父节点 - MessageBox 不会触发
- 我单击没有子节点的子节点 - MessageBox 不会触发
- 我再次单击没有子节点的子节点 - 消息框触发
- 我单击带有子节点的父节点 - 消息框触发
- 我再次单击带有子节点的父节点 - 消息框不会触发。
在调试期间,该SelectedNode.Count
值似乎是它之前单击的数字。
这里发生了什么?
解决方案
您的问题源于OnNodeMouseClick
在任何与选择相关的事件(OnBeforeSelect
& OnAfterSelect
)之前触发的事实,这意味着SelectedNode
您正在检查的尚未更新。
如果您只关心选择更改,则订阅BeforeSelect
(具有取消选择的能力)或AfterSelect
改为订阅。这也将使用键盘处理更改选择。
与选择相关的事件不同,NodeMouseClick
即使选定的节点没有改变(例如,您正在单击一个已经选定的节点),它仍然会触发。此外,顾名思义,这仅适用于鼠标单击,而不适用于使用键盘导航树时。
要查看后台实际发生的情况,您可以查看 TreeView 的源代码,特别是WmNotify 方法。您会看到这是由 Windows消息NodeMouseClick
触发的。然后它在单击的 (x,y) 坐标处执行命中测试以查找鼠标下的节点,如果找到,则在事件的参数中将NM_CLICK
其返回给您。TreeNodeMouseClickEventArgs
TLDR:订阅 时NodeMouseClick
,您的选择尚未更改(并且可能不会更改),但您可以通过检查事件 arg 来查看单击的节点。仅在使用鼠标而不是键盘时有效。
推荐阅读
- javascript - 数据表 jquery
- c++ - 当向量的两个元素相乘时,向量c ++与运算符*不匹配
- c# - 公开 razor 视图的依赖注入以进行测试
- java - janino 编译 Java 代码抛出“找不到类异常”
- c - 为什么 timerfd 定期 Linux 定时器的到期时间比预期的要早一点?
- angular - Ng-bootstrap 模式窗口在订阅的错误部分不起作用
- html - 是否可以使用重复线性渐变属性设置边框图像和背景?
- javascript - 将 .css 文件中的 CSS 添加到材质组件
- wordpress - 在产品画廊阵容中 - 使简短的摘录成为最小长度
- apache-spark - Exception while starting Spark History Server