Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TreeView检测节点选择,但在选中或取消选中时不进行选择_C#_Winforms_Treeview - Fatal编程技术网

C# TreeView检测节点选择,但在选中或取消选中时不进行选择

C# TreeView检测节点选择,但在选中或取消选中时不进行选择,c#,winforms,treeview,C#,Winforms,Treeview,我有一个使用该事件触发的事件,它可以正常工作,但是如果用户选中或取消选中此节点或树中任何节点的复选框,我不希望触发该事件。或者,事件可以触发,但是我需要知道事件内部是否是由于选中或取消选中复选框而触发的。我尝试改用NodeMouseClick,但得到了同样的不想要的结果,我还尝试使用BeforeCheck删除事件处理程序,并使用AfterCheck将其添加回,如下所示: private void MyTree_BeforeCheck(object sender, TreeViewCancelEv

我有一个使用该事件触发的事件,它可以正常工作,但是如果用户选中或取消选中此节点或树中任何节点的复选框,我不希望触发该事件。或者,事件可以触发,但是我需要知道事件内部是否是由于选中或取消选中复选框而触发的。我尝试改用NodeMouseClick,但得到了同样的不想要的结果,我还尝试使用BeforeCheck删除事件处理程序,并使用AfterCheck将其添加回,如下所示:

private void MyTree_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
    this.MyTree.AfterSelect -= new System.Windows.Forms.TreeViewEventHandler(this.MyTree_AfterSelect);
}

private void MyTree_AfterCheck(object sender, TreeViewEventArgs e)
{
    this.MyTree.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.MyTree_AfterSelect);
}

private void MyTree_AfterSelect(object sender, TreeViewEventArgs e)
{
    ShowMyInfo(e.Node);
}
但余选事件仍在发生

我不能依赖于检查后的
,因为如果您只选择节点,它将不会触发。我也不能依赖于检查是否
e.Node.Selected==true
,因为该节点可能已经被检查过了,如果该节点实际上是故意选择的,我希望事件触发

是否有任何我可以使用的事件处理程序,只有在选中某个节点且未选中或取消选中时才会触发,或者有任何我可以检测刚刚选中的节点是否已选中或取消选中的方式


将Visual Studio 2019与C#WinForms.NET Framework应用程序一起使用。

正如@Jimi和@dr.null所指出的,我毕竟使用了正确的事件。AfterSelect不会仅因为选中或取消选中复选框而激发

我遇到的问题是,如果右键单击某个节点,我的代码将选择该节点(右键单击不会自动选择节点)

旧代码:

    private void MyTree_MouseDown(object sender, MouseEventArgs e)
    {
        MyTree.SelectedNode = MyTree.GetNodeAt(e.X, e.Y);
    }
新代码:

    private void MyTree_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right) MyTree.SelectedNode = MyTree.GetNodeAt(e.X, e.Y);
    }

我无意中触发了自己的事件,因为我没有检查在MouseDown事件上单击了哪个鼠标按钮。谢谢你的帮助

当用户选中/取消选中节点时,不会引发IIRC,
AfterSelect
。只有当节点被点击时,而不是复选框,正如Jimi所说。除非您有一些代码选择节点,无论是否选中该节点,否则这种情况永远不会发生。类似于在
鼠标上选择节点单击
节点使用单击
或其他位置。现在,检查
AfterSelect
事件和
返回中的属性
如果它返回
treevaction.Unknown
并查看其运行情况。