我有这样的代码:
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值似乎是它前面单击的数字。
这里发生什么事情?
发布于 2018-11-05 05:35:40
您的问题源于这样一个事实:OnNodeMouseClick在任何与选择相关的事件(OnBeforeSelect & OnAfterSelect)之前被触发,这意味着您正在检查的SelectedNode还没有更新。
如果您只关心所选内容的更改,则订阅BeforeSelect (可以取消所选内容)或AfterSelect。这将处理改变的选择使用键盘以及。
与与选择相关的事件不同,即使所选节点没有变化,NodeMouseClick仍然会触发(例如,单击已经选定的节点)。此外,顾名思义,这只适用于鼠标单击,而不是当使用键盘导航您的树。
要查看背景中实际发生了什么,您可以查看TreeView的源代码,特别是WmNotify法。您将看到NodeMouseClick是由windows NM_CLICK消息触发的。然后在单击的(x,y)坐标处执行命中测试,以查找鼠标下的节点,如果找到,则在事件的TreeNodeMouseClickEventArgs参数中将其返回给您。
TLDR:当订阅NodeMouseClick时,您的选择还没有改变(而且它可能没有改变),但是您可以通过检查事件arg来查看单击的节点。只在使用鼠标时工作,而不使用键盘。
https://stackoverflow.com/questions/53146313
复制相似问题