TREEVIEW-CHECKBOX父节点随子节点的变化而变化

vbyes 2008-11-08 04:37:45
TREEVIEW-CHECKBOX父节点随子节点的变化而变化


1
Private Sub CheckChild(ByVal Node As MSComctlLib.Node, ByVal bCheck As Boolean, Optional ByVal bNext As Boolean = True, Optional ByVal bChild As Boolean = True)
If Not Node Is Nothing Then
Node.Checked = bCheck
If Node.Children And bChild Then
Call CheckChild(Node.Child, bCheck, True, True) '对子节点
End If
If bNext Then
Call CheckChild(Node.Next, bCheck, True, bChild) '对同一层节点
End If
End If
End Sub

Private Sub TreeView11_NodeCheck(ByVal Node As MSComctlLib.Node)
Call CheckChild(Node, Node.Checked, False, True) '处理子节点
End Sub

2
Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)
Dim i As Long
Dim NodX As Node
Set NodX = Node

'这里是处理如果该节点的子节点被选掉,则该父节点以至于上溯到根节点都被选掉
Do While NodX.Root <> NodX
If NodX.Checked = False And NodX.Root <> NodX Then NodX.Parent.Checked = False
Set NodX = NodX.Parent
Loop
'使用递归,把该节点的字节点都选中
If Node.Children > 0 Then
For i = Node.Child.FirstSibling.Index To Node.Child.LastSibling.Index
TreeView1.Nodes.Item(i).Checked = Node.Checked
Call TreeView1_NodeCheck(TreeView1.Nodes.Item(i))
Next i
End If
Set NodX = Nothing
End Sub


1和2 的两种方法 只是 在选择父节点时,子节点作相应变化, 我现在想问的是 如果 所有节点前的 CHECKBOX 都为空(勾都取消) ,现在 我在 某个节点打上勾,那么它的所有父节点也应该有变化 :
具体变化是这样: 假设所有节点的 CHECKBOX 都为空 ,某个节点的子节点共有3个,当在其中一个子节点上打上勾,那么其子节点的所有父节点(父父节点)都打上 灰色的 勾, 如果3个子节点都打勾,那么这3个子节点的所有父节点(父父节点)都打上 黑 色的 勾 . 如果能把瑞星软件 打开看看和操作一下 其树目录 就能明白我的意思了,请高手帮忙,是否需要用到API函数,因为灰色的勾表示里面只有一部分子节点被选中打勾,而这个灰色是如何做的呢?

...全文
287 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
northwolves 2008-11-11
  • 打赏
  • 举报
回复
vbyes 2008-11-11
  • 打赏
  • 举报
回复
谢谢 狼版.....
tongnaifu 2008-11-09
  • 打赏
  • 举报
回复
大体看了一下,TREEVIEW的checked状态只有True和False,并不能达到3种状态的情况,所以个人认为不行。
vbyes 2008-11-09
  • 打赏
  • 举报
回复
这个我也知道。
那我请问瑞星是如何做到的?
还有如果使用API能否达到效果?
vbyes 2008-11-09
  • 打赏
  • 举报
回复
Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)
If Node <> Node.Root Then
Node.Parent.Checked = Node.Checked
Call TreeView1_NodeCheck(Node.Parent)
End If
End Sub
vbyes 2008-11-09
  • 打赏
  • 举报
回复
这个我也看见过了,也就是说VB除 API 是不可能做成 瑞星那样的,不管怎样,非常感谢你.

可以这样判断是否是根结点,以防止错误.

If Node <> Node.Root Then
Call CheckParnt(TreeView1.Nodes.Item(1), Node) '测试时用根节点
End If
SYSSZ 2008-11-09
  • 打赏
  • 举报
回复
好像没效果
aohan 2008-11-09
  • 打赏
  • 举报
回复
没有印象CHECKBOX是否有2这个状态,也就是变灰,但选择父节点还是可以做到的,刚刚写了一个





Function CheckParnt(RootNode As Node, CurrentNode As Node) As String
'RootNode为根节点,或者指定的某一层级的父节点
'CurrentNode为当前节点
'将指定层级的父节点勾选项
Dim Check As Boolean
Do
Check = CurrentNode.Checked
Set CurrentNode = CurrentNode.Parent
CurrentNode.Checked = Check
Loop Until CurrentNode Is RootNode

End Function

Private Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)
Call CheckParnt(TreeView1.Nodes.Item(1), Node) '测试时用根节点
End Sub

vbyes 2008-11-09
  • 打赏
  • 举报
回复
是的。
我就是想知道VB是否不能做到?
瑞星是什么语言做的?
VB是否与其他语言的优秀上相差的大了?
tongnaifu 2008-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 vbyes 的回复:]
这个我也知道。
那我请问瑞星是如何做到的?
还有如果使用API能否达到效果?
[/Quote]
瑞星也不是用VB写的啊,他应该是用了自己的控件吧
vbyes 2008-11-09
  • 打赏
  • 举报
回复
恩,呵呵以前没注意,CHECKBOX控件到是有灰色。
SYSSZ 2008-11-09
  • 打赏
  • 举报
回复
CHECKBOX控件是有三个值的0,1,2,value 为2时灰色,可用CHECKBOX自己做一个用户控件
vbyes 2008-11-09
  • 打赏
  • 举报
回复
可是瑞星软件不但有图标还有CHECKBOX,我并一定是需要这样,只是想探讨一下瑞星是如何做到的,我们能否做到?
SYSSZ 2008-11-09
  • 打赏
  • 举报
回复
你的问题似乎可以这样解决----准备三张图标(1)方框,(2)方框带勾,(3)灰色带勾的方框,根据不同的要求选择不同的Node的image,比如,选中了孙节点,孙节点的image方框带勾.其余孙节点为方框,父节点和根节点的image灰色带勾的方框,这就是瑞星的效果

1,453

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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