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

Posted

技术标签:

【中文标题】TreeView 检测节点选择,但在选中或取消选中时不检测【英文标题】:TreeView detect node select but not when checking or unchecking 【发布时间】:2021-04-05 06:53:24 【问题描述】:

我有一个使用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,因为如果您只是选择节点,它就不会触发。我也不能依赖检查 e.Node.Selected == true,因为节点可能已经被检查,如果节点实际上是故意选择的,我希望事件触发。

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

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

【问题讨论】:

IIRC,AfterSelect 在用户选中/取消选中节点时不会引发。仅当/当单击节点时,而不是 CheckBox。 正如吉米所说。这永远不会发生,除非您有一些代码选择节点,无论它是否被选中。就像在 MouseClickNodeMouseClick 或其他地方选择一个节点一样。现在,检查AfterSelect 事件中的TreeViewEventArgs.Action 属性和return; 是否返回TreeViewAction.Unknown,看看情况如何。 【参考方案1】:

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

【讨论】:

以上是关于TreeView 检测节点选择,但在选中或取消选中时不检测的主要内容,如果未能解决你的问题,请参考以下文章

el-tree父子节点的选中取消

怎么让所有子节点被选中,父节点自动选中 TreeView

怎么让所有子节点被选中,父节点自动选中 TreeView

如何在TreeView中选中他的节点时,更改节点的背景颜色?

Winform 中使用treeview控件,treeview控件会默认选择最后一个有子节点的节点,怎么解决

Delphi TreeView 选择父节点,选择所有子节点