对于WinFormTreeView,“检查节点文本单击”

时间:2013-06-18 15:52:34

标签: .net winforms treeview

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

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

 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之前触发(我不明白,因为它是导致检查更改的鼠标点击),所以我真的没有压制任何东西。

第二,NodeMouseClick甚至会触发Open \ Close字形的点击,显然我不想更改它的检查状态。但是NodeClick事件args没有指定单击节点的哪个部分(打开/关闭,文本或复选框)。如何在文本点击中设计一个检查节点的错误方法?

1 个答案:

答案 0 :(得分: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
相关问题