天天看點

TreeViewVisitor: 一個快捷通路 TreeView 控件節點的幫助類

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) {

            }                        

        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 控件。但如果我們進一步思考,則可以很容易的推廣到對普通的樹狀結構,或者多級菜單的通路邏輯中。進而實作與具體控件無關的通路邏輯。

因為業餘時間有限,先到此打住。