TreeView如何进行多选

farrio 2004-06-24 09:06:06
TreeView类好像没有MultiSelect这样的属性,那么如何能让TreeView也支持多个Node选择?
...全文
968 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
farrio 2004-06-24
  • 打赏
  • 举报
回复
支持CTRL的复数选择的TreeView。
SHIFT功能比CTRL还难,还没做出来呢。


Public Class MultiSelectTreeView
Inherits Windows.Forms.TreeView

Public Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Integer) As Integer

Private Const VK_CONTROL As Integer = &H11
Private Const VK_SHIFT As Integer = &H10

Private m_MutliSelect As Boolean
Private m_SelBackColor As Color
Private m_SelNodes As ArrayList
Private m_AlterKeyStatus As AlterKeyStatus
Private m_ndPerSelect As TreeNode

Private Enum AlterKeyStatus
None = 0
Ctrl = 1
Shift = 2
End Enum

Public Property MutliSelect() As Boolean
Get
Return Me.m_MutliSelect
End Get
Set(ByVal Value As Boolean)
Me.m_MutliSelect = Value
End Set
End Property

Public Property SelectedBackColor() As Color
Get
Return Me.m_SelBackColor
End Get
Set(ByVal Value As Color)
Me.m_SelBackColor = Value
End Set
End Property

Public ReadOnly Property SelectedNodes() As TreeNode()
Get
Return Me.m_SelNodes.ToArray(GetType(TreeNode))
End Get
End Property

Public Sub New()
MyBase.New()

Me.m_MutliSelect = True
Me.m_SelBackColor = Color.SkyBlue
Me.m_SelNodes = New ArrayList
End Sub

Private Sub FillSelectedNode(ByVal nd As TreeNode)
Dim _nd As TreeNode
Me.m_SelNodes.Clear()
If (Not Me.m_ndPerSelect Is Nothing) AndAlso (Not Me.m_ndPerSelect Is nd) AndAlso (Me.m_ndPerSelect.Parent Is nd.Parent) Then
Me.ClearSelectStyle(Me.Nodes(0))
If nd.Index > Me.m_ndPerSelect.Index Then
Me.m_SelNodes.Add(Me.m_ndPerSelect)
_nd = Me.m_ndPerSelect.NextVisibleNode
While Not _nd Is Nothing AndAlso Not _nd Is nd
Me.m_SelNodes.Add(_nd)
_nd = _nd.NextVisibleNode
End While
Me.m_SelNodes.Add(nd)
Else
Me.m_SelNodes.Add(nd)
_nd = nd.NextVisibleNode
While Not _nd Is Nothing AndAlso Not Me.m_ndPerSelect Is nd
Me.m_SelNodes.Add(_nd)
_nd = _nd.NextVisibleNode
End While
Me.m_SelNodes.Add(Me.m_ndPerSelect)
End If
For Each _nd In Me.m_SelNodes
_nd.BackColor = Me.m_SelBackColor
Next
Else
Me.m_SelNodes.Add(nd)
End If
End Sub

Private Sub ClearSelectStyle(ByVal nd As TreeNode)
Dim _nd As TreeNode
nd.BackColor = Color.Empty
For Each _nd In nd.Nodes
Me.ClearSelectStyle(_nd)
Next
End Sub

Private Sub RemoveSelectNode(ByVal nd As TreeNode)
If Me.m_SelNodes.Contains(nd) = True Then
Me.m_SelNodes.Remove(nd)
nd.BackColor = (New TreeNode).BackColor
End If
End Sub

Private Sub AppendSelectedNode(ByVal nd As TreeNode)
Dim _nd As TreeNode
Dim blnExist As Boolean = False
For Each _nd In Me.m_SelNodes
If nd Is _nd Then
Me.RemoveSelectNode(nd)
blnExist = True
Exit For
End If
Next
If blnExist = False Then
Me.m_SelNodes.Add(nd)
For Each _nd In Me.m_SelNodes
'If Not _nd.BackColor.Equals(Me.m_SelBackColor) = False Then
_nd.BackColor = Me.m_SelBackColor
'End If
Next
End If
End Sub

Private Function GetAlterKeyStatus() As AlterKeyStatus
Dim ret As AlterKeyStatus
If Math.Abs(GetKeyState(VK_CONTROL)) >= 2 ^ 6 Then
ret = AlterKeyStatus.Ctrl
ElseIf Math.Abs(GetKeyState(VK_SHIFT)) >= 2 ^ 6 Then
ret = AlterKeyStatus.Shift
Else
ret = AlterKeyStatus.None
End If
Return ret
End Function

Protected Overrides Sub OnAfterSelect(ByVal e As System.Windows.Forms.TreeViewEventArgs)
MyBase.OnAfterSelect(e)
If Not Me.SelectedNode Is Nothing Then
Select Case GetAlterKeyStatus()
Case AlterKeyStatus.Ctrl
Me.AppendSelectedNode(Me.SelectedNode)
'Case AlterKeyStatus.Shift
' Me.FillSelectedNode(Me.SelectedNode)
Case Else
Me.ClearSelectStyle(Me.Nodes(0))
Me.m_SelNodes.Clear()
Me.m_SelNodes.Add(Me.SelectedNode)
End Select
End If
Me.m_ndPerSelect = e.Node
End Sub

Public Sub ClearSelectedNodes()
Me.ClearSelectStyle(Me.Nodes(0))
Me.m_SelNodes.Clear()
End Sub

End Class
farrio 2004-06-24
  • 打赏
  • 举报
回复
回kaicat(螃蟹):TreeNode.Checked = Value 就可以了。
回3tzjq() :老兄正解!偶正在做,不过比想象的麻烦。我准备做成和.NET Solution Explorer一样的功能。
可乐罐 2004-06-24
  • 打赏
  • 举报
回复
多选?想如何表现?
3tzjq 2004-06-24
  • 打赏
  • 举报
回复
重写TreeView控件,加入MultiSelect属性并提供实现
kaicat 2004-06-24
  • 打赏
  • 举报
回复
那请问楼上,如何对节点的check属性赋值呢?
farrio 2004-06-24
  • 打赏
  • 举报
回复
我希望能够让TreeView支持多选,而不是使用CheckBox。不过还是要感谢楼上的老兄。没人解决过这个问题么?
水如烟 2004-06-24
  • 打赏
  • 举报
回复
参见TreeView类:
树节点可以选择性地显示复选框。若要显示复选框,请将 TreeView 的 CheckBoxes 属性设置为 true。对于处于选中状态的树节点,Checked 属性设置为 true。

dgczy 2004-06-24
  • 打赏
  • 举报
回复
我也在想这个问题。

16,549

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧