treeview 钩选问题

feilo 2007-06-14 01:08:08
- 单位档案
- 单位档案查看
- 单位档案维护
+ 短信
+ 分析助手

+、-号是用来展开和收缩的,但每个node旁边还有checkbox可选,问题是:怎么样做到钩选父节点的时候,子节点全部钩上,父节点去钩的时候子节点也全部去钩,子节点全部钩上的时候,父节点也钩上,子节点部份钩上的时候父节点半钩(有些软件好像是用实心反灰表示的),子节点全部去钩的时候,父节点也去钩。
不知道有没有属性可以直接设置,还是要用代码遍历treview,请各位高手指点。
...全文
367 8 打赏 收藏 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
bote_china 2007-06-15
  • 打赏
  • 举报
回复
可以在AfterCheck事件中处理,
Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck
If e.Action = TreeViewAction.ByKeyboard Or e.Action = TreeViewAction.ByMouse Then
Dim ee As TreeViewEventArgs
If Not e.Node.Parent Is Nothing Then
If e.Node.Checked = True Then
e.Node.Parent.Checked = e.Node.Checked
Else
Dim IsAllUnSelect As Boolean = True
For Each nod As TreeNode In e.Node.Parent.Nodes
If nod.Checked <> e.Node.Checked Then
IsAllUnSelect = False
Exit For
End If
Next
If IsAllUnSelect = True Then
e.Node.Parent.Checked = e.Node.Checked
End If
End If
End If
CheckNode(e.Node.Nodes, e.Node.Checked)
End If
End Sub

Private Sub CheckNode(ByVal Nodes As TreeNodeCollection, ByVal Checked As Boolean)
For Each nod As TreeNode In Nodes
nod.Checked = Checked
If nod.GetNodeCount(True) > 0 Then
CheckNode(nod.Nodes, Checked)
End If
Next
End Sub
ycg_893 2007-06-15
  • 打赏
  • 举报
回复
半钩的确不能实现,除非你自己写,如用图片,很麻烦。如果要实现选中或取消父级,所有子级选中或取消,只要任一子级选中,父级也选中,只要所有子级全部取消父级也取消,是可以做的。但不能在AfterCheck这个事件中实现,因为在这个事件是矛盾的。
51Crack 2007-06-15
  • 打赏
  • 举报
回复
半钩就别指望了
CSDN相关的问题很多,搜一下就知道!
feilo 2007-06-15
  • 打赏
  • 举报
回复
看了一下资料,treeview 的确没有半选状态,而且在AfterCheck事件里面给节点赋值会递归调用AfterCheck事件,所以我定义了一个全局开关变量,只有在鼠标点击钩选的时候才触发AfterCheck事件,在代码中赋值就算触发了也马上返回,方法是笨了点,但还算能解决问题,楼上Bote_China()方法应该是正解的,原理跟我自己做的应该是差不多,但我已经用我的方法实现了,在此也要说声谢谢,下面把我的代码也贴出来,希望也能供遇到这种问题的兄弟们有个参考!
Dim nodeLock As Boolean = True //全局开关变量,只有nodeLock 是true的时候才会执行AfterCheck事件中的代码,否则进入AfterCheck后马上返回
//钩选时调用
Private Sub selectAllNode(ByVal vNode As TreeNode)
nodeLock = False
Dim i As Integer = 0
If vNode.Nodes.Count > 0 Then
For i = 0 To vNode.Nodes.Count - 1
vNode.Nodes(i).Checked = True
Next i
Else
vNode.Parent.Checked = True
End If
nodeLock = True
End Sub
//去钩时调用
Private Sub noSelectAllNode(ByVal vNode As TreeNode)
nodeLock = False
Dim i As Integer = 0
If vNode.Nodes.Count > 0 Then
For i = 0 To vNode.Nodes.Count - 1
vNode.Nodes(i).Checked = False
Next i
Else
For i = 0 To vNode.Parent.Nodes.Count - 1
If vNode.Parent.Nodes(i).Checked = True Then
nodeLock = True
Return
End If
Next i
vNode.Parent.Checked = False
End If
nodeLock = True
End Sub
//AfterCheck事件
Private Sub TreeView2_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView2.AfterCheck
If nodeLock = True Then
Dim i As Integer = 0
Dim vNode As TreeNode = e.Node
If vNode.Checked = True Then
selectAllNode(vNode)
Else
noSelectAllNode(vNode)
End If
Else
Return
End If

End Sub
netusemaster 2007-06-14
  • 打赏
  • 举报
回复
不能设置,要用代码去判断。
遍历判断,父或者子。
北京的雾霾天 2007-06-14
  • 打赏
  • 举报
回复
父节点半钩
--------------------
默认的情况下,TreeView是实现不了的,要么勾上,要么不勾上,除非自绘制TreeView.
zhomgkai 2007-06-14
  • 打赏
  • 举报
回复
具体怎么操作我也没有做过,不过给你提供个思路:相对于子节点都有父节点,就是".parent",你查一下关于操作父节点的资料就能解决你的问题了
feilo 2007-06-14
  • 打赏
  • 举报
回复
刚用VB.NET不久啊,请高手们帮帮忙啊

16,718

社区成员

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

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