TreeView节点快速访问之道

http://www.cnblogs.com/xxm/archive/2006/10/06/522318.html


前几天在木野狐老大的园子里逛,见了新出的贴子《一个快捷访问 TreeView 控件节点的帮助类》,受到其中的代码启发。借老大的代码过来。自己改了改,将节点遍历的过程分离出来。做成了两个虚函数。我们可以在遍历的过程中。做更多的工作,而我们使用的方法,就是继承这个类。并重写这两个虚函数就可以,基于本人是菜鸟级的原因,代码可能不是很好。请各位前辈不吝指教。
  1using System;
  2using System.Collections.Generic;
  3using System.Text;
  4using System.Windows.Forms.ComponentModel;
  5using System.Windows.Forms;
  6namespace TreeNodeCatch
  7{
  8    public  class TreeNodeAccess
  9    {
 10        private TreeView _TreeView;
 11        private TreeNode _TreeNode;
 12        private List<TreeNode> nodes;
 13        private delegate void SetEachNode(TreeNode tn);
 14        private event SetEachNode OnGetEachNode;
 15        private delegate void EndEachAction();
 16        private event EndEachAction OnGetAllNode;
 17        protected  TreeNodeAccess() { }
 18        public TreeNodeAccess(TreeView treeview)
 19        {
 20            _TreeView = treeview;
 21        }
 22        public TreeNodeAccess(TreeNode treenode)
 23        {
 24            _TreeNode = treenode;
 25        }
 26        private void Walk(TreeNode node)
 27        {
 28            if (node == null)
 29            {
 30                nodes.Add(_TreeView.Nodes[0]);
 31                foreach (TreeNode childNode in _TreeView.Nodes[0].Nodes)
 32                {
 33                    Walk(childNode);
 34                }
 35            }
 36            else
 37            {
 38                nodes.Add(node);
 39                foreach (TreeNode childNode in node.Nodes)
 40                {
 41                    Walk(childNode);
 42                }
 43            }
 44        }
 45        private IEnumerable<TreeNode> GetAllTreeNodes()
 46        {
 47            nodes = new List<TreeNode>();
 48            Walk(null);
 49            foreach (TreeNode node in nodes)
 50            {
 51                yield return node;
 52            }
 53        }
 54        private IEnumerable<TreeNode> GetAllTreeNodes(TreeNode TreeNode)
 55        {
 56            nodes = new List<TreeNode>();
 57            Walk(TreeNode);
 58            foreach (TreeNode node in nodes)
 59            {
 60                yield return node;
 61            }
 62        }
 63        public virtual int MaxLen
 64        {
 65            get
 66            {
 67
 68               List<TreeNode> Tmp = nodes;
 69               Tmp.Sort(delegate(TreeNode a, TreeNode b) { return -a.Level.CompareTo(b.Level); });
 70               int Max = Tmp[0].Level;
 71               Tmp = null;
 72               return Max;
 73            }
 74        }
 75        private void Action(TreeNodeAccess ClassName)
 76        {
 77            IEnumerable<TreeNode> nodes;
 78            if (_TreeView != null)
 79            {
 80                nodes = GetAllTreeNodes();
 81            }
 82            else
 83            {
 84                nodes = GetAllTreeNodes(_TreeNode);
 85            }
 86            foreach (TreeNode node in nodes)
 87            {
 88                if (OnGetEachNode != null)
 89                {
 90                    OnGetEachNode(node);
 91                    ClassName.OnGetEachNode(node);
 92                }
 93            }
 94            if (OnGetAllNode!= null)
 95            {
 96                OnGetAllNode();
 97                ClassName.OnGetAllNode();
 98            }
 99        }
100
101        public  bool SearchNode(string value,SearchMode Mode)
102        {
103            TreeNode Res;
104            TreeView MyTree;
105            if (_TreeNode != null)
106            {
107                MyTree =_TreeNode.TreeView;
108            }
109            else
110            {
111                MyTree = _TreeView;
112            }
113            switch (Mode)
114            {
115                case SearchMode.ByText:
116                    {
117                        Res = nodes.Find(delegate(TreeNode tn) { return tn.Text ==value; });
118                        break;
119                    }
120                case SearchMode.ByName:
121                    {
122                        Res = nodes.Find(delegate(TreeNode tn) { return tn.Name == value ; });
123                        break;
124                    }
125                default:
126                    {
127                        Res = null;
128                        break;
129                    }
130            }
131            if (Res != null)
132            {
133                MyTree.SelectedNode = Res;
134                Res.Parent.Expand();
135                return true;
136            }
137            else
138            {
139                return false;
140            }
141        }
142        public virtual void Execute(TreeNode Node){}
143        public virtual void FinishGetNode(){}
144        public void Load(TreeNodeAccess ClassName)
145        {
146            OnGetAllNode += new EndEachAction(FinishGetNode);
147            OnGetEachNode += new SetEachNode(Execute);
148            ClassName.OnGetAllNode += new EndEachAction(ClassName.FinishGetNode);
149            ClassName.OnGetEachNode += new SetEachNode(ClassName.Execute);
150            Action(ClassName);
151        }
152    }
153    public enum SearchMode
154    {ByText,ByName}
155}
156

其中Execute虚函数是遍历每一个节点时触发的过程。FineshGetNode是完成了遍历完所有节点后触发的过程,TreeNodeAccess类可以用TreeView和TreeNode来初始化。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值