3

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

4

1 回答 1

3

您可以检查 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
于 2013-06-18T16:03:28.313 回答