热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> .Net编程>>正文内容

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

发布时间:2010年06月02日点击数: 佚名

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

  1. using System; 
  2. using System.Data; 
  3. using System.Configuration; 
  4. using System.Web; 
  5. using System.Web.Security; 
  6. using System.Web.UI; 
  7. using System.Web.UI.WebControls; 
  8. using System.Web.UI.WebControls.WebParts; 
  9. using System.Web.UI.HtmlControls; 
  10. using System.Collections.Generic; 
  11.  
  12. namespace CmsNet2.Components { 
  13.     /// <summary> 
  14.     /// TreeViewVisitor by Neil Chen, 2006-09-28 
  15.     /// </summary> 
  16.     public class TreeViewVisitor { 
  17.  
  18.         public TreeViewVisitor(TreeView treeView) { 
  19.             this.treeView = treeView; 
  20.         } 
  21.  
  22.         private TreeView treeView; 
  23.  
  24.         public TreeView TreeView { 
  25.             get { return treeView; } 
  26.             set { treeView = value; } 
  27.         } 
  28.  
  29.         private void Walk(TreeNode node) { 
  30.             if (node == null) { 
  31.                 nodes.Add(treeView.Nodes[0]); 
  32.  
  33.                 foreach (TreeNode childNode in treeView.Nodes[0].ChildNodes) { 
  34.                     Walk(childNode); 
  35.                 } 
  36.             } else { 
  37.                 nodes.Add(node); 
  38.  
  39.                 foreach (TreeNode childNode in node.ChildNodes) { 
  40.                     Walk(childNode); 
  41.                 } 
  42.             }                         
  43.         } 
  44.  
  45.         private List<TreeNode> nodes; 
  46.  
  47.         public IEnumerable<TreeNode> GetAllTreeNodes() { 
  48.             nodes = new List<TreeNode>(); 
  49.  
  50.             Walk(null); 
  51.  
  52.             foreach (TreeNode node in nodes) { 
  53.                 yield return node; 
  54.             } 
  55.         } 
  56.     } 

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

  1. public void SetCheckedCategories(List<Category> categories) { 
  2.     // 创建访问器对象 
  3.     TreeViewVisitor visitor = new TreeViewVisitor(tvCategories); 
  4.      
  5.     // 得到“铺平”了的所有节点集合 
  6.     IEnumerable<TreeNode> nodes = visitor.GetAllTreeNodes(); 
  7.  
  8.     // 进行你需要的访问操作 
  9.     foreach (TreeNode node in nodes) { 
  10.         foreach (Category category in categories) { 
  11.             if (category.CategoryId == int.Parse(node.Value)) { 
  12.                 node.Checked = true;                         
  13.             } 
  14.         } 
  15.     }            

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

本站热点业务

更多模板/案例展示

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作