首页 | 路由技术 | 交换技术 | 接入技术 | 综 合布线 | 网络管理 | 网络安全 | 操作系统 | 实用技巧 | 业界动态
最 新咨询 | 网络编程 | 软件编程 | 脚本技术 | 网页制作 | 网站技巧 | 数据库  | 精品收藏 | 免费资源 | 在线书店
当前位置: 首页 >天空618-IT技术 >网站技巧 >正文
关键字: 模糊搜索:

TreeView中让子节点随父节点改变状态

发布时间:08-08-14 12:41:43      来源:天空618-IT技术     作者:admin
最新报道

分析的话我们就不多说了,下面直接看示例程序如何来实现这个功能。

首先建立一个项目,拖放一个TreeView 控件于窗体上,然后为TreeView 控件添加类似下图一所示的树状结构:

TreeView中让子节点随父节点改变状态(图一)
图一:示例的窗体

先建立一个检查某个节点的所有子节点的递归过程,通过它我们遍历所有的子节点,同时根据父节点的状态改变它们的复选框状态,代码如下:

Private Sub CheckAllChildNodes(ByVal treeNode As TreeNode, ByVal nodeChecked As Boolean)

Dim node As TreeNode

For Each node In treeNode.Nodes

node.Checked = nodeChecked

If node.Nodes.Count > 0 Then

Me.CheckAllChildNodes(node, nodeChecked)

End If

Next node

End Sub

同时我们也想根据某个节点的状态改变来影响其所有上层的父节点的状态。例如,一个第三层的节点复选框状态从选中变为非选中,如果第三层其它的节点的复选框都是非选中状态,就让它们的父节点(第二层的某个节点)状态改变为非选中,依次类推到最顶级的根节点。要实现这样的功能,我们也需要通过一个递归过程来判断,判断依据为:当一个节点Node的复选框状态改变时,我们就遍历它父节点的Nodes(该集合包含了Node)集合,对比Nodes中是不是所有节点都和Node的状态相同,如果所有节点都为非选中的状态,则父节点变为非选中状态,否则为选中状态。详细代码如下:

'检查所有的本层节点,如果所有节点都选中,则父节点也选中,如果所有节点非选中,则父节点也不选中

Private Sub CheckAllFatherNodes(ByVal treeNode As TreeNode, ByVal nodeChecked As Boolean)

Dim node As TreeNode

Dim isSame As Boolean = True '记下nodeChecked的状态

If Not treeNode.Parent Is Nothing Then

For Each node In treeNode.Parent.Nodes

'碰到与nodeChecked状态不一样的节点

If node.Checked <> nodeChecked Then

isSame = False

Exit For

End If

Next

If isSame = False Then

'当所有节点中有一个不一样的节点时,肯定存在一个是选中的节点,所以父节点为选中

treeNode.Parent.Checked = True

Else

'当所有节点的状态都一样时,父节点状态等于节点状态

treeNode.Parent.Checked = nodeChecked

End If

CheckAllFatherNodes(treeNode.Parent, treeNode.Parent.Checked)

End If

node = Nothing

End Sub

然后在TreeView 控件的 AfterCheck 事件中添加如下代码:

Private Sub TreeView1_AfterCheck(ByVal sender As Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) Handles TreeView1.AfterCheck

If e.Action <> TreeViewAction.Unknown Then

If e.Node.Nodes.Count > 0 Then

Me.CheckAllChildNodes(e.Node, e.Node.Checked)

End If

CheckAllFatherNodes(e.Node, e.Node.Checked)

Debug.WriteLine(e.Node.Text)

End If

End Sub

注意,因为每个节点复选框的状态改变后都会引发 AfterCheck 事件,我们为了避免无限次地进入递归中,就需要判断TreeViewAction的状态,所有被我们使用代码自动选中的节点的TreeViewAction 状态为 Unknown,因为可以避免我们调用递归过程的时候出问题。

http://www.qqrea d.com/book/myvbnet/my0051.html

代码编写完毕,现在我们运行程序,单击改变节点的状态,观察下它的子节点和父节点的复选框状态的变化,如下两个图为其中的两种情况:

TreeView中让子节点随父节点改变状态(图二)
图二:示例运行效果图

TreeView中让子节点随父节点改变状态(图三)
图三:示例运行效果图


·上一篇文章:
·下一篇文章:
[ 返回上一页 ]字体[  ] [ 打印 ] [ 发送好友:发送给好友 ][ 加入收藏:加入收藏夹 ]
 
发表评论 ?
  相关文章
相关文章

无相关新闻

最新文章
· TreeView中让子节点随父节点改变
· vb.net GDI+:使用DrawString显示
· 如何使用ASP.Net加密Cookie 
· 如何在 Ubuntu 8.04 上安装KDE 4
· 预装 Ubuntu 8.04 的戴尔电脑再添
· 微软一个未修复的漏洞对IE 6用户
· 微软:Windows 7一切顺利/IE8年底
· Windows 7到来时 你的PC准备好了
· 网管必学:网络数据测试实践三步
· VB.NET连接数据库方法大全 
· Java泛型编程快速入门
· Java程序员:一刻钟精通正则表达
· Java程序员的学习目标:破坏源程
· Java程序员的迷失—论“虚拟机”
· 杀毒软件市场怪现象之 误杀、暗杀
· 解决系统疑难杂症 用户必备工具S
· 实战:三顾茅庐 用DD-WRT突破网络
· 北京2008年奥运会直播
· sem,seo ,ppc 是什么意思
· checkbox实现全选的多种方法