关于如何移除TreeView中的所有选中节点的一点体会
2007-05-08 13:13
483 查看
关于这个算法大概有两个常用的方法,一个就是递归,一个非递归的(呵呵,好像是废话哈),递归写起来可能代码比较简洁,但是效率不高,非递归方法写起来不是很容易,但是效率较递归来说很有优势,下面我就说一下我在这方面的两个方法(这是现在我做项目体会到的)。
先看看我用的递归方法,整体思路是:首先对根节点下的所有子节点做一个循环,在循环体里边,①判断该子节点是否是叶节点,是的话就移除该节点,并且将子节点数count减一,计数器i也减一,否则就递归调用方法traverse ( childNode )并重新获取该节点的子节点数(childCount = childNode.ChildNodes.Count;)②判断该节点的子节点数是否为0,是的话就移除该节点
[align=left]// 获得TreeView的根节点[/align]
[align=left]TreeNode node = TreeView.Nodes [0];[/align]
[align=left]// 递归方法[/align]
[align=left]traverse ( node );[/align]
[align=left] [/align]
[align=left] ///<summary>[/align]
[align=left] ///递归移除所有选中的节点[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="parentNode"></param>[/align]
[align=left] private void traverse ( TreeNode parentNode )[/align]
[align=left] {[/align]
[align=left] int count = parentNode.ChildNodes.Count;[/align]
[align=left] for ( int i = 0 ; i < count ; i++ )[/align]
[align=left] {[/align]
[align=left] TreeNode childNode = parentNode.ChildNodes [i];[/align]
[align=left] // 移除之前的子节点数[/align]
[align=left] int childCount = childNode.ChildNodes.Count;[/align]
[align=left] // 移除算法[/align]
[align=left] if ( childCount > 0 )[/align]
[align=left] {[/align]
[align=left] // 递归调用[/align]
[align=left] traverse ( childNode );[/align]
[align=left] // 移除之后剩余的子节点[/align]
[align=left] childCount = childNode.ChildNodes.Count;[/align]
[align=left] }[/align]
[align=left] else if ( childNode.ChildNodes.Count == 0 && childNode.Checked )[/align]
[align=left] {[/align]
[align=left] // 您要做的其他操作[/align]
[align=left] [/align]
[align=left] // 移除被选中的节点[/align]
[align=left] parentNode.ChildNodes.Remove ( childNode );[/align]
[align=left] --count;[/align]
[align=left] --i;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // 移除被选中的父节点(如果父节点的子节点数为0,父节点也要移除)[/align]
[align=left] if ( childCount == 0 )[/align]
[align=left] {[/align]
[align=left] parentNode.ChildNodes.Remove ( childNode );[/align]
[align=left] --count;[/align]
[align=left] --i;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]下面是非递归算法,整体思路是循环访问TreeView里边的选中的节点的集合的第一个节点(checkBoxes [0]),①如果checkBoxes [0]不是叶节点,就将其选中状态设为false,而不移除②如果checkBoxes [0]是叶节点,判断其父节点的子节点数是否为1,是的话就将checkBoxes [0]的父节点设置为要移除的节点(父节点被移除,子节点也会跟着被移除,于是达到了移除只有一个子节点的父节点的子节点时联动移除该子节点的父节点的目的),再去判断它的父节点的父节点的子节点数是否为1(while ( node.Parent.ChildNodes.Count == 1 ))……如此循环,最后移除当前的节点,那么该节点下的所有子节点都会被移除[/align]
[align=left] [/align]
[align=left]// 非递归方法[/align]
[align=left]RemoveCheckedNodes ( TreeView);[/align]
[align=left] [/align]
[align=left] ///<summary>[/align]
[align=left] ///清除选中的节点并更新数据库[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="tree"></param>[/align]
[align=left] private void RemoveCheckedNodes ( TreeView tree )[/align]
[align=left] {[/align]
[align=left] // 获取所有选中的节点集合[/align]
[align=left] TreeNodeCollection checkBoxes = tree.CheckedNodes;[/align]
[align=left] while ( checkBoxes.Count > 0 )[/align]
[align=left] {[/align]
[align=left] // 判断checkBoxes [0]节点是否是叶节点[/align]
[align=left] if (checkBoxes [0]不是叶节点 )[/align]
[align=left] {[/align]
[align=left] checkBoxes [0].Checked = false;[/align]
[align=left] }[/align]
[align=left] else if (checkBoxes [0]是叶节点 )[/align]
[align=left] {[/align]
[align=left] // 您要做的其他操作[/align]
[align=left] [/align]
[align=left] // 声明当前选中节点为要移除的节点[/align]
[align=left] TreeNode node = checkBoxes [0];[/align]
[align=left] [/align]
[align=left] // 循环判断节点的父节点的所有子节点数是否为1[/align]
[align=left] // 是的话就设父节点为要移除的节点[/align]
[align=left] while ( node.Parent.ChildNodes.Count == 1 )[/align]
[align=left] {[/align]
[align=left] node = node.Parent;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // 移除节点[/align]
[align=left] TreeNode parentNode = node.Parent;[/align]
[align=left] parentNode.ChildNodes.Remove ( node );[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
先看看我用的递归方法,整体思路是:首先对根节点下的所有子节点做一个循环,在循环体里边,①判断该子节点是否是叶节点,是的话就移除该节点,并且将子节点数count减一,计数器i也减一,否则就递归调用方法traverse ( childNode )并重新获取该节点的子节点数(childCount = childNode.ChildNodes.Count;)②判断该节点的子节点数是否为0,是的话就移除该节点
[align=left]// 获得TreeView的根节点[/align]
[align=left]TreeNode node = TreeView.Nodes [0];[/align]
[align=left]// 递归方法[/align]
[align=left]traverse ( node );[/align]
[align=left] [/align]
[align=left] ///<summary>[/align]
[align=left] ///递归移除所有选中的节点[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="parentNode"></param>[/align]
[align=left] private void traverse ( TreeNode parentNode )[/align]
[align=left] {[/align]
[align=left] int count = parentNode.ChildNodes.Count;[/align]
[align=left] for ( int i = 0 ; i < count ; i++ )[/align]
[align=left] {[/align]
[align=left] TreeNode childNode = parentNode.ChildNodes [i];[/align]
[align=left] // 移除之前的子节点数[/align]
[align=left] int childCount = childNode.ChildNodes.Count;[/align]
[align=left] // 移除算法[/align]
[align=left] if ( childCount > 0 )[/align]
[align=left] {[/align]
[align=left] // 递归调用[/align]
[align=left] traverse ( childNode );[/align]
[align=left] // 移除之后剩余的子节点[/align]
[align=left] childCount = childNode.ChildNodes.Count;[/align]
[align=left] }[/align]
[align=left] else if ( childNode.ChildNodes.Count == 0 && childNode.Checked )[/align]
[align=left] {[/align]
[align=left] // 您要做的其他操作[/align]
[align=left] [/align]
[align=left] // 移除被选中的节点[/align]
[align=left] parentNode.ChildNodes.Remove ( childNode );[/align]
[align=left] --count;[/align]
[align=left] --i;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // 移除被选中的父节点(如果父节点的子节点数为0,父节点也要移除)[/align]
[align=left] if ( childCount == 0 )[/align]
[align=left] {[/align]
[align=left] parentNode.ChildNodes.Remove ( childNode );[/align]
[align=left] --count;[/align]
[align=left] --i;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left]下面是非递归算法,整体思路是循环访问TreeView里边的选中的节点的集合的第一个节点(checkBoxes [0]),①如果checkBoxes [0]不是叶节点,就将其选中状态设为false,而不移除②如果checkBoxes [0]是叶节点,判断其父节点的子节点数是否为1,是的话就将checkBoxes [0]的父节点设置为要移除的节点(父节点被移除,子节点也会跟着被移除,于是达到了移除只有一个子节点的父节点的子节点时联动移除该子节点的父节点的目的),再去判断它的父节点的父节点的子节点数是否为1(while ( node.Parent.ChildNodes.Count == 1 ))……如此循环,最后移除当前的节点,那么该节点下的所有子节点都会被移除[/align]
[align=left] [/align]
[align=left]// 非递归方法[/align]
[align=left]RemoveCheckedNodes ( TreeView);[/align]
[align=left] [/align]
[align=left] ///<summary>[/align]
[align=left] ///清除选中的节点并更新数据库[/align]
[align=left] ///</summary>[/align]
[align=left] ///<param name="tree"></param>[/align]
[align=left] private void RemoveCheckedNodes ( TreeView tree )[/align]
[align=left] {[/align]
[align=left] // 获取所有选中的节点集合[/align]
[align=left] TreeNodeCollection checkBoxes = tree.CheckedNodes;[/align]
[align=left] while ( checkBoxes.Count > 0 )[/align]
[align=left] {[/align]
[align=left] // 判断checkBoxes [0]节点是否是叶节点[/align]
[align=left] if (checkBoxes [0]不是叶节点 )[/align]
[align=left] {[/align]
[align=left] checkBoxes [0].Checked = false;[/align]
[align=left] }[/align]
[align=left] else if (checkBoxes [0]是叶节点 )[/align]
[align=left] {[/align]
[align=left] // 您要做的其他操作[/align]
[align=left] [/align]
[align=left] // 声明当前选中节点为要移除的节点[/align]
[align=left] TreeNode node = checkBoxes [0];[/align]
[align=left] [/align]
[align=left] // 循环判断节点的父节点的所有子节点数是否为1[/align]
[align=left] // 是的话就设父节点为要移除的节点[/align]
[align=left] while ( node.Parent.ChildNodes.Count == 1 )[/align]
[align=left] {[/align]
[align=left] node = node.Parent;[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] // 移除节点[/align]
[align=left] TreeNode parentNode = node.Parent;[/align]
[align=left] parentNode.ChildNodes.Remove ( node );[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
相关文章推荐
- 如何移除TreeView中的所有选中节点
- 如何让treeview的所有节点前面的checkbox全部取消选中?
- TreeView中如何选中一个父节点同时选中所有的子节点和孙节点。。。
- 关于BCB 的Treeview 选中节点高亮有关问题
- TreeView 关于节点选中
- C#中TreeView选中父节点同时选中所有的子节点
- Treeview选中所有节点
- VB.Net程序设计:获取TreeView CheckBox所有选中的节点值
- 递归获取treeview选中父节点的所有子节点
- asp.net TreeView安装、使用(如何将TreeView打包发布)(带CheckBox选择框的TreeView的初始化,TreeView客户端操作:选择父节点后自动选择所有子节点,子节点选择后自动选择父节点)(TreeView节点精确定位)
- 如何使用javascript得到TreeView当前选中的节点【收集】
- 【转】C#中 TreeView如何获取某一节点下的所有子节点
- asp.net TreeView安装、使用(如何将TreeView打包发布)(带CheckBox选择框的TreeView的初始化,TreeView客户端操作:选择父节点后自动选择所有子节点,子节点选择后自动选择父节点)(TreeView节点精确定位)
- 操作TreeView:,选中左边树的节点,点击>>按钮 将选择的节点展现到右边的树中,同时将选择的节点从左边的树中移除。。点击<<实现同样的功能。。。。
- 关于ztree打开关闭所有节点,选中指定id节点
- treeview 如何改变选中节点的背景。
- 关于ztree打开关闭所有节点,选中指定id节点
- 如何在右键单击treeview的某节点时,同时选中该节点?
- treeview(winform)里如何用命令指定选中某一个节点,并引发afterselect事件?
- 在.Net Framework1.1的环境下,调用TreeView控件,生成树图,点选父节点,则所有的子结点也选中,取消选中的父节点下的子结点,则父节点也取消选中状态。