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/