首页 > 解决方案 > TreeView 检测节点选择,但在选中或取消选中时不检测

问题描述

我有一个使用AfterSelect事件触发的事件,它工作得很好,但是如果用户选中或取消选中此或树中任何节点的复选框,我不希望此事件触发。或者,该事件可以触发,但是我需要知道事件内部是否由于选中或取消选中复选框而触发它。我尝试使用 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);
}

但是 AfterSelect 事件仍然会触发。

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

有没有我可以使用的事件处理程序,它只会在节点被选中,而不是被选中或未被选中时触发,或者我可以通过任何方式检测刚刚选中的节点是否已被选中或未选中。

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

标签: c#winformstreeview

解决方案


正如@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 事件上单击了哪个鼠标按钮。感谢您的帮助!


推荐阅读