.net - "Check on node text click"用于 WinFormTreeView

标签 .net winforms treeview

Winforms TreeView 的默认行为是仅在单击复选框时选中/取消选中节点。我想实现一个 TreeView ,如果单击节点文本(禁用用户编辑节点文本),它也会切换检查状态。

TreeView 事件的性质使这比看起来更困难。我最初的方法是继承 TreeView ,覆盖节点鼠标单击事件,并抑制默认的树节点检查行为(因为我自己检查节点,如果我不抑制它会导致鼠标单击时的双重检查实际上是在节点复选框上):

 Private _SuppressCheck As Boolean = False

 Protected Overrides Sub OnBeforeCheck(e As System.Windows.Forms.TreeViewCancelEventArgs)
        If _SuppressCheck Then e.Cancel = True
        MyBase.OnBeforeCheck(e)
    End Sub

    ''' <summary>
    ''' Enables node checking for click on any part of node.
    ''' </summary>
    Protected Overrides Sub OnNodeMouseClick(e As System.Windows.Forms.TreeNodeMouseClickEventArgs)
        Try
            If e.Button = Windows.Forms.MouseButtons.Left Then
                e.Node.Checked = Not e.Node.Checked
                _SuppressCheck = True
            End If
            MyBase.OnNodeMouseClick(e)
        Finally
            _SuppressCheck = False
        End Try
    End Sub

然而,这至少存在两个大问题。第一, OnBeforeCheck 在 OnNodeMouseClick 之前触发(我不明白,因为鼠标点击导致检查更改),所以我真的没有抑制任何东西。

第二,即使单击 Open\Close 字形,NodeMouseClick 也会触发,显然我不想为此更改检查状态。但是 NodeClick 事件参数没有指定点击了节点的哪一部分(打开/关闭、文本或复选框)。如何设计一种错误较少的方法来检查文本单击时的节点?

最佳答案

您可以检查 Bounds 属性:

Protected Overrides Sub OnNodeMouseClick(e As TreeNodeMouseClickEventArgs)
  MyBase.OnNodeMouseClick(e)
  If e.Button = MouseButtons.Left AndAlso _
     e.Node.Bounds.Contains(New Point(e.X, e.Y)) Then
    e.Node.Checked = Not e.Node.Checked
  End If
End Sub

关于.net - "Check on node text click"用于 WinFormTreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17173441/

相关文章:

c# - 当我将它存储到静态变量时,我无法访问 OperationContext.Current

c# winforms toolstripmenuitem 更改背景

c# - 如何获取动态添加到 Windows 窗体 C# 中的控件的值?

python - 在 Python .Net 中将 C# 字节数组转换为 numpy 数组

c# - 在 .NET 4.0 WinForms 应用程序中使用 POS.NET 失败

.net - 创建表 Controller 时 Azure 应用服务移动应用 .Net 后端问题

c# - 使winforms在没有UI的情况下运行的命令行

c# - 查找在上下文菜单下单击的节点

c# - 如何在 TreeView 中找到根节点

wpf - 如何在WPF中仅通过单击来获取选定的TreeViewItem?