我有此代码:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (treeView1.SelectedNode.Nodes.Count == 0)
{
MessageBox.Show("The node does not have any children.");
}
}
单击没有子级的treeView节点时,似乎在事件触发方面存在滞后。
例如:
在调试过程中,SelectedNode.Count
值似乎是它之前被点击的次数。
这是怎么回事?
答案 0 :(得分:1)
您的问题源于OnNodeMouseClick
在任何与选择相关的事件(OnBeforeSelect
和OnAfterSelect
)之前被触发,这意味着您正在检查的SelectedNode
尚未更新。
如果您只关心选择的更改,请订阅BeforeSelect
(可以取消选择)或AfterSelect
。这也将使用键盘来处理更改的选择。
与选择相关的事件不同,NodeMouseClick
仍会触发,即使所选节点是不变(例如,您单击已选择的节点)。另外,顾名思义,此操作仅在鼠标单击和上有效,而在使用键盘导航树时不起作用。
要查看后台实际发生的情况,可以查看TreeView的源代码,特别是WmNotify method。您会看到NodeMouseClick
由Windows NM_CLICK
消息触发。然后,它在单击的(x,y)坐标上执行一次点击测试,以查找鼠标下方的节点,如果找到,则在事件的TreeNodeMouseClickEventArgs
自变量内将其还给您。
TLDR:预订NodeMouseClick
时,您的选择尚未更改(并且可能未更改),但是您可以通过检查事件arg来查看单击的节点。仅在使用鼠标而非键盘时有效。