【问题标题】:"Check on node text click" for WinFormTreeViewWinFormTreeView 的“检查节点文本单击”
【发布时间】:2013-06-18 15:52:34
【问题描述】:

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

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

 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 事件参数没有指定节点的哪个部分(打开/关闭、文本或复选框)被单击。如何设计一种错误较少的方法来检查文本单击时的节点?

【问题讨论】:

    标签: .net winforms treeview


    【解决方案1】:

    您可以只检查 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
    

    【讨论】:

    • 谢谢,工作完美,代码更简单。我永远不会猜到——只是假设复选框包含在节点边界中,但好在它不是。
    • 哇,在花了几个小时试图找到解决方法之后,这个答案拯救了我的一天。非常感谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-13
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多