首页 > 解决方案 > .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 节点时,事件触发似乎存在延迟。

例如:

  1. 我单击带有子节点的父节点 - MessageBox 不会触发
  2. 我单击没有子节点的子节点 - MessageBox 不会触发
  3. 我再次单击没有子节点的子节点 - 消息框触发
  4. 我单击带有子节点的父节点 - 消息框触发
  5. 我再次单击带有子节点的父节点 - 消息框不会触发。

在调试期间,该SelectedNode.Count值似乎是它之前单击的数字。

这里发生了什么?

标签: c#eventstreeviewlag

解决方案


您的问题源于OnNodeMouseClick在任何与选择相关的事件(OnBeforeSelect& OnAfterSelect)之前触发的事实,这意味着SelectedNode您正在检查的尚未更新。

如果您只关心选择更改,则订阅BeforeSelect(具有取消选择的能力)或AfterSelect改为订阅。这也将使用键盘处理更改选择。

与选择相关的事件不同,NodeMouseClick即使选定的节点没有改变(例如,您正在单击一个已经选定的节点),它仍然会触发。此外,顾名思义,这仅适用于鼠标单击而不适用于使用键盘导航树时。

要查看后台实际发生的情况,您可以查看 TreeView 的源代码,特别是WmNotify 方法。您会看到这是由 Windows消息NodeMouseClick触发的。然后它在单击的 (x,y) 坐标处执行命中测试以查找鼠标下的节点,如果找到,则在事件的参数中将NM_CLICK其返回给您。TreeNodeMouseClickEventArgs

TLDR:订阅 时NodeMouseClick,您的选择尚未更改(并且可能不会更改),但您可以通过检查事件 arg 来查看单击的节点。仅在使用鼠标而不是键盘时有效。


推荐阅读