TreeView如何实现联动,选择一个子节点,其父节点虚选择

cdrzi 2007-10-24 12:50:57
类型:VB.NET WINFORM

TreeView如何实现联动,选择一个子节点,其父节点虚选择



如上:这是效果,PS的
谁能提供个实例
...全文
409 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
localCMS 2007-11-07
  • 打赏
  • 举报
回复
这个是我写的组件

选择框支持
1.选定状态
2.未选定
3.部分选定
4.可以自己定义三状态的图片(设置一个StateImage)0:未选;1:钩选;2:部选
5.可以设置从默认已经钩选项目
SelectNodes(nodes,str)
nodes:需要遍历的节点
str:Node的Tag,用来比较是否是需要的节点,所以Tag值必须不一样
语言:VB.NET 2005
调用:VS 2005工具箱加入即可
localCMS 2007-11-07
  • 打赏
  • 举报
回复
http://download.csdn.net/source/279669
cdrzi 2007-10-26
  • 打赏
  • 举报
回复
你可以做成组件
hhbkiller 2007-10-25
  • 打赏
  • 举报
回复
自己写代码做事件,没有现成的
cdrzi 2007-10-25
  • 打赏
  • 举报
回复
我现在发现这里的很多朋友,自己解决的问题,不告诉大家自己是如何解决的,
所以希望大家以后如果自己解决的问题能在帖子上说下解决方法.

cdrzi 2007-10-25
  • 打赏
  • 举报
回复
又自己解决,不过还是谢谢大家了.
把代码共享给需要的朋友

首先建立一个ImageList

在ImageList里分别放置 为钩选,钩选,未知钩选三个图片

然后StateImageList里选择该ImageList

模块:
Module DiyTreeView

Public TreeView_Check_Changed As Boolean = True

#Region "TreeView CheckBox 联动"

Private Enum NodeState
AllUnSelected = 0 '全不选
AllSelected = 1 '全选
SomeSelected = 2 '部分选定
End Enum

Public Sub checkChanged(ByVal tree As TreeView, ByVal e As MouseEventArgs)
If Not TreeView_Check_Changed Then
TreeView_Check_Changed = True
Exit Sub
End If
Dim n As TreeNode
n = tree.GetNodeAt(e.X, e.Y)
If n Is Nothing Then
Exit Sub
End If
If n.GetNodeCount(False) > 0 And (n.Parent Is Nothing) Then
If n.StateImageIndex = 0 Then
n.StateImageIndex = 1
ElseIf n.StateImageIndex = 1 Or n.StateImageIndex = 2 Then
n.StateImageIndex = 0
End If
ChangeAllChildNodesState(n, CType(n.StateImageIndex, NodeState))
ElseIf n.GetNodeCount(False) > 0 And (Not (n.Parent Is Nothing)) Then
If n.StateImageIndex = 0 Then
n.StateImageIndex = 1
ElseIf n.StateImageIndex = 1 Or n.StateImageIndex = 2 Then
n.StateImageIndex = 0
End If
ChangeAllChildNodesState(n, CType(n.StateImageIndex, NodeState))
ChangeAllParentState(n)
ElseIf n.GetNodeCount(False) = 0 And (Not (n.Parent Is Nothing)) Then
If n.StateImageIndex = 0 Then
n.StateImageIndex = 1
ElseIf n.StateImageIndex = 1 Or n.StateImageIndex = 2 Then
n.StateImageIndex = 0
End If
ChangeAllParentState(n)
ElseIf n.GetNodeCount(False) = 0 And (n.Parent Is Nothing) Then
If n.StateImageIndex = 0 Then
n.StateImageIndex = 1
ElseIf n.StateImageIndex = 1 Or n.StateImageIndex = 2 Then
n.StateImageIndex = 0
End If
End If
End Sub

' 改变n的所有子节点的状态
Private Sub ChangeAllChildNodesState(ByVal n As TreeNode, ByVal NodeStateDes As NodeState)
Dim myEnumerator As IEnumerator = n.Nodes.GetEnumerator()
While myEnumerator.MoveNext()
CType(myEnumerator.Current, TreeNode).StateImageIndex = NodeStateDes
ChangeAllChildNodesState(CType(myEnumerator.Current, TreeNode), NodeStateDes)
End While
End Sub

'n为当前节点(而要被改变状态的是n的父节点,也就是n.parent)
Private Sub ChangeAllParentState(ByVal n As TreeNode)
Dim blnAllUnSelected, blnAllSelected As Boolean
If n.Parent Is Nothing Then
Exit Sub
End If
Dim myEnumerator As IEnumerator = n.Parent.Nodes.GetEnumerator()
While myEnumerator.MoveNext()
If CType(myEnumerator.Current, TreeNode).StateImageIndex = 2 Then
n.Parent.StateImageIndex = 2
Call ChangeAllParentState(n.Parent)
Return
ElseIf CType(myEnumerator.Current, TreeNode).StateImageIndex = 1 Then
If blnAllUnSelected Then
n.Parent.StateImageIndex = 2
Call ChangeAllParentState(n.Parent)
Return
Else
blnAllSelected = True
End If
ElseIf CType(myEnumerator.Current, TreeNode).StateImageIndex = 0 Then
If blnAllSelected Then
n.Parent.StateImageIndex = 2
Call ChangeAllParentState(n.Parent)
Return
Else
blnAllUnSelected = True
End If
End If
End While
If blnAllSelected And Not blnAllUnSelected Then
n.Parent.StateImageIndex = 1
Call ChangeAllParentState(n.Parent)
Return
End If
If blnAllUnSelected And Not blnAllSelected Then
n.Parent.StateImageIndex = 0
Call ChangeAllParentState(n.Parent)
Return
End If
End Sub

#End Region

End Module


使用方法:

Dim newNode As New TreeNode(strText)
newNode.StateImageIndex = 0'加上这句,加载后全部未钩选
nodes.Add(newNode)
.......'递归加载树

然后:
 Private Sub mainTreeViewMouseUp(ByVal sender As Object, ByVal e As Windows.Forms.MouseEventArgs) Handles  TreeView1.MouseUp
checkChanged(TreeView1, e)
End Sub

Private Sub TreeViewBeforeCollapse(ByVal sender As Object, ByVal e As Windows.Forms.TreeViewCancelEventArgs) Handles TreeView1.BeforeCollapse, TreeView1.BeforeExpand
TreeView_Check_Changed = False
End Sub
cdrzi 2007-10-24
  • 打赏
  • 举报
回复
应该可以用StateImageList

选中状态StateImageList的图片列表变换来实现以上效果
设置StateImageList怎么弄

有没有这方面的资料啊
boblaw 2007-10-24
  • 打赏
  • 举报
回复
.net中的TreeView控件,是實現不了這個功能的,因為牠的選擇框,衹有兩個狀態Checked和UnChecked
可以從TreeView派生一個新類來實現,請參考這篇文章http://blog.csdn.net/mengyao/archive/2007/08/13/1741174.aspx

16,554

社区成员

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

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