TreeViewVisitor: 一个快捷访问 TreeView 控件节点的帮助类

Web 开发中经常用到 TreeView 控件,一个很常见的操作就是 遍历所有的节点。但是该控件本身并未提供此功能,每次都要手工写递归访问的函数,非常烦琐。所以我写了一个简单的帮助类来解决这个问题,这样就不需要每次用递归来访问了:

using  System;
using  System.Data;
using  System.Configuration;
using  System.Web;
using  System.Web.Security;
using  System.Web.UI;
using  System.Web.UI.WebControls;
using  System.Web.UI.WebControls.WebParts;
using  System.Web.UI.HtmlControls;
using  System.Collections.Generic;

namespace  CmsNet2.Components {
    
///   <summary>
    
///  TreeViewVisitor by Neil Chen, 2006-09-28
    
///   </summary>
     public   class  TreeViewVisitor {

        
public  TreeViewVisitor(TreeView treeView) {
            
this .treeView  =  treeView;
        }

        
private  TreeView treeView;

        
public  TreeView TreeView {
            
get  {  return  treeView; }
            
set  { treeView  =  value; }
        }

        
private   void  Walk(TreeNode node) {
            
if  (node  ==   null ) {
                nodes.Add(treeView.Nodes[
0 ]);

                
foreach  (TreeNode childNode  in  treeView.Nodes[ 0 ].ChildNodes) {
                    Walk(childNode);
                }
            } 
else  {
                nodes.Add(node);

                
foreach  (TreeNode childNode  in  node.ChildNodes) {
                    Walk(childNode);
                }
            }                        
        }

        
private  List < TreeNode >  nodes;

        
public  IEnumerable < TreeNode >  GetAllTreeNodes() {
            nodes 
=   new  List < TreeNode > ();

            Walk(
null );

            
foreach  (TreeNode node  in  nodes) {
                yield 
return  node;
            }
        }
    }
}

一个简单的使用范例:遍历所有节点,并将符合条件的节点选中。

public   void  SetCheckedCategories(List < Category >  categories) {
    
//  创建访问器对象
    TreeViewVisitor visitor  =   new  TreeViewVisitor(tvCategories);
    
    
//  得到“铺平”了的所有节点集合
    IEnumerable < TreeNode >  nodes  =  visitor.GetAllTreeNodes();

    
//  进行你需要的访问操作
     foreach  (TreeNode node  in  nodes) {
        
foreach  (Category category  in  categories) {
            
if  (category.CategoryId  ==   int .Parse(node.Value)) {
                node.Checked 
=   true ;                        
            }
        }
    }           
}

当然,目前这个类的应用范围很局限,仅仅限于 TreeView 控件。但如果我们进一步思考,则可以很容易的推广到对普通的树状结构,或者多级菜单的访问逻辑中。从而实现与具体控件无关的访问逻辑。

因为业余时间有限,先到此打住。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值