.NET Treeview NodeMouseClick事件是否有滞后?

时间:2018-11-04 22:54:42

标签: c# events treeview lag

我有此代码:

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值似乎是它之前被点击的次数。

这是怎么回事?

1 个答案:

答案 0 :(得分:1)

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

如果您只关心选择的更改,请订阅BeforeSelect(可以取消选择)或AfterSelect。这也将使用键盘来处理更改的选择。

与选择相关的事件不同,NodeMouseClick仍会触发,即使所选节点是不变(例如,您单击已选择的节点)。另外,顾名思义,此操作仅在鼠标单击上有效,而在使用键盘导航树时不起作用。

要查看后台实际发生的情况,可以查看TreeView的源代码,特别是WmNotify method。您会看到NodeMouseClick由Windows NM_CLICK消息触发。然后,它在单击的(x,y)坐标上执行一次点击测试,以查找鼠标下方的节点,如果找到,则在事件的TreeNodeMouseClickEventArgs自变量内将其还给您。

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