DevExpress TreeList使用

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Drawing;
  4 using System.Windows.Forms;
  5 using DevExpress.XtraBars;
  6 using DevExpress.XtraTreeList;
  7 using DevExpress.XtraTreeList.Nodes;
  8 
  9 namespace DevExpressUtilHelpV3
 10 {
 11   public static class TreeListToolV3
 12   {
 13     public delegate string BuildPathRule(string nodeText, string fullPathInfo);
 14     /// <summary>
 15     /// 获取选中节点到根节点的所有信息
 16     /// </summary>
 17     /// <param name="focusedNode">TreeListNode</param>
 18     /// <param name="columnID">列名称</param>
 19     /// <param name="buildPathRule">规则委托</param>
 20     /// <returns>路径信息</returns>
 21     public static string FullPathInfo(this TreeListNode focusedNode, string columnID, BuildPathRule buildPathRule)
 22     {
 23       if (focusedNode == null)
 24         throw new ArgumentNullException("focusedNode");
 25       if (string.IsNullOrEmpty("columnID"))
 26         throw new ArgumentNullException("columnID");
 27       string _fullPathInfo = string.Empty;
 28       _fullPathInfo = focusedNode.GetDisplayText(columnID);
 29       while (focusedNode.ParentNode != null)
 30       {
 31         focusedNode = focusedNode.ParentNode;
 32         string _nodeText = focusedNode.GetDisplayText(columnID).Trim();
 33         _fullPathInfo = buildPathRule(_nodeText, _fullPathInfo);
 34       }
 35       return _fullPathInfo;
 36     }
 37     public delegate bool CompareNodeRule(TreeListNode focusedNode);
 38     /// <summary>
 39     /// 获取筛选节点到根节点的所有信息
 40     /// </summary>
 41     /// <param name="focusedNode">TreeListNode</param>
 42     /// <param name="columnID">列名称</param>
 43     /// <param name="compareNodeRule">规则委托</param>
 44     /// <param name="buildPathRule">规则委托</param>
 45     /// <returns>路径信息</returns>
 46     public static string FilterPathInfo(this TreeListNode focusedNode, string columnID, CompareNodeRule compareNodeRule, BuildPathRule buildPathRule)
 47     {
 48       if (focusedNode == null)
 49         throw new ArgumentNullException("focusedNode");
 50       if (string.IsNullOrEmpty("columnID"))
 51         throw new ArgumentNullException("columnID");
 52       string _fullPathInfo = string.Empty;
 53       _fullPathInfo = focusedNode.GetDisplayText(columnID);
 54       while (focusedNode.ParentNode != null)
 55       {
 56         focusedNode = focusedNode.ParentNode;
 57         if (compareNodeRule(focusedNode))
 58         {
 59           string _nodeText = focusedNode.GetDisplayText(columnID).Trim();
 60           _fullPathInfo = buildPathRule(_nodeText, _fullPathInfo);
 61         }
 62       }
 63       return _fullPathInfo;
 64     }
 65     /// <summary>
 66     /// 递归遍历树节点
 67     /// </summary>
 68     /// <param name="tree"></param>
 69     /// <param name="opreateRule"></param>
 70     public static void LoopTree(this TreeList tree, Action<TreeListNode> opreateRule)
 71     {
 72       if (tree == null)
 73         throw new ArgumentNullException("tree");
 74       foreach (TreeListNode node in tree.Nodes)
 75       {
 76         opreateRule(node);
 77         if (node.Nodes.Count > 0)
 78         {
 79           LoopTreeNodes(node, opreateRule);
 80         }
 81       }
 82     }
 83     /// <summary>
 84     /// 递归遍历TreeListNode节点
 85     /// </summary>
 86     /// <param name="node"></param>
 87     /// <param name="opreateRule"></param>
 88     public static void LoopTreeNodes(this TreeListNode node, Action<TreeListNode> opreateRule)
 89     {
 90       if (node == null)
 91         throw new ArgumentNullException("node");
 92       foreach (TreeListNode _childNode in node.Nodes)
 93   {
 94   opreateRule(_childNode);
 95   LoopTreeNodes(_childNode, opreateRule);
 96   }
 97   }
 98 /// <summary>
 99 /// 递归遍历TreeListNode,当opreateRule返回false停止循环
100 /// </summary>
101 /// <param name="node">TreeListNode</param>
102 /// <param name="opreateRule">Func<TreeListNode, bool></param>
103 public static void LoopTreeNodes_Break(this TreeListNode node, Func<TreeListNode, bool> opreateRule)
104   {
105 if (node == null)
106 throw new ArgumentNullException("node");
107 foreach (TreeListNode _childNode in node.Nodes)
108   {
109 if (!opreateRule(_childNode))
110 break;
111   LoopTreeNodes_Break(_childNode, opreateRule);
112   }
113   }
114 /// <summary>
115 /// 递归遍历TreeListNode,当opreateRule返回false跳出循环,直接进入下次循环
116 /// </summary>
117 /// <param name="node">TreeListNode</param>
118 /// <param name="opreateRule">Func<TreeListNode, bool></param>
119 public static void LoopTreeNodes_Continue(this TreeListNode node, Func<TreeListNode, bool> opreateRule)
120   {
121 if (node == null)
122 throw new ArgumentNullException("node");
123 foreach (TreeListNode _childNode in node.Nodes)
124   {
125 if (!opreateRule(_childNode))
126 continue;
127   LoopTreeNodes_Continue(_childNode, opreateRule);
128   }
129   }
130 public delegate bool CheckNodeRule(TreeListNode fucusedNode);
131 public delegate void CheckNodeNullRule();
132 /// <summary>
133 /// 节点为null检查
134 /// </summary>
135 /// <param name="fucusedNode">TreeListNode</param>
136 /// <param name="checkNodeRule">若为NULL,处理逻辑</param>
137 /// <returns>TreeListNode</returns>
138 public static TreeListNode CheckNull(this TreeListNode fucusedNode, CheckNodeNullRule checkNodeRule)
139   {
140 if (fucusedNode == null)
141   {
142   checkNodeRule();
143 return null;
144   }
145 return fucusedNode;
146   }
147 /// <summary>
148 /// 正对节点的检查逻辑
149 /// </summary>
150 /// <param name="fucusedNode">TreeListNode</param>
151 /// <param name="checkNodeRule">检查逻辑代码[委托]</param>
152 /// <returns>TreeListNode</returns>
153 public static TreeListNode Check(this TreeListNode fucusedNode, CheckNodeRule checkNodeRule)
154   {
155 if (fucusedNode != null)
156 return checkNodeRule(fucusedNode) == true ? fucusedNode : null;
157 return null;
158   }
159 /// <summary>
160 /// 水平滚动条
161 /// </summary>
162 /// <param name="tree">TreeList</param>
163 public static void HorzScroll(this TreeList tree)
164   {
165 if (tree == null)
166 throw new ArgumentNullException("tree");
167   tree.OptionsView.AutoWidth = false;
168   tree.BestFitColumns();
169   tree.HorzScrollVisibility = ScrollVisibility.Always;
170   }
171 /// <summary>
172 /// 为TreeList附加右键菜单
173 /// MouseUp(object sender, MouseEventArgs e)事件中调用
174 /// </summary>
175 /// <param name="tree">TreeList</param>
176 /// <param name="e">MouseEventArgs</param>
177 /// <param name="menu">PopupMenu</param>
178 /// <param name="attachMenuRule">AttachMenuRule</param>
179 public static void AttachMenu(this TreeList tree, MouseEventArgs e, PopupMenu menu, Func<TreeListNode, bool> attachMenuRule)
180   {
181 if (tree == null)
182 throw new ArgumentNullException("tree");
183 if (menu == null)
184 throw new ArgumentNullException("menu");
185 if (e.Button == MouseButtons.Right && Control.ModifierKeys == Keys.None && tree.State == TreeListState.Regular)
186   {
187   Point _point = new Point(Cursor.Position.X, Cursor.Position.Y);
188   TreeListHitInfo _hitInfo = tree.CalcHitInfo(e.Location);
189 if (_hitInfo.HitInfoType == HitInfoType.Cell)
190   tree.SetFocusedNode(_hitInfo.Node);
191 if (attachMenuRule(tree.FocusedNode))
192   menu.ShowPopup(_point);
193   }
194   }
195 /// <summary>
196 /// 设置父节点的状态AfterCheckNode(object sender, NodeEventArgs e)
197 /// </summary>
198 /// <param name="node"></param>
199 /// <param name="check"></param>
200 public static void ProcessNodeCheckState(this TreeListNode node, CheckState check)
201   {
202 if (node == null)
203 throw new ArgumentNullException("node");
204   SetCheckedChildNodes(node, check);
205   SetCheckedParentNodes(node, check);
206   }
207 /// <summary>
208 /// 设置子节点CheckState
209 /// </summary>
210 /// <param name="node"></param>
211 /// <param name="check"></param>
212 private static void SetCheckedChildNodes(TreeListNode node, CheckState check)
213   {
214 if (node != null)
215   {
216   node.LoopTreeNodes((TreeListNode _node) =>
217   {
218   _node.CheckState = check;
219   });
220   }
221   }
222 /// <summary>
223 /// 设置父节点CheckState
224 /// </summary>
225 /// <param name="node"></param>
226 /// <param name="check"></param>
227 private static void SetCheckedParentNodes(TreeListNode node, CheckState check)
228   {
229 if (node.ParentNode != null)
230   {
231 bool _checkStatus = false;
232   CheckState _nodeState;
233   node.LoopTreeNodes_Break((TreeListNode _node) =>
234   {
235   _nodeState = _node.CheckState;
236 if (!check.Equals(_nodeState))
237   {
238   _checkStatus = !_checkStatus;
239 return false;//跳出循环
240   }
241 return true;//继续循环
242   });
243   node.ParentNode.CheckState = _checkStatus ? CheckState.Indeterminate : check;
244   SetCheckedParentNodes(node.ParentNode, check);
245   }
246   }
247 /// <summary>
248 /// 根据CheckState获取TreeListNode
249 /// </summary>
250 /// <param name="tree">TreeList</param>
251 /// <param name="state">CheckState</param>
252 /// <param name="GetNodesByStateRule">返回True的时候继续</param>
253 /// <returns>TreeListNode集合</returns>
254 public static List<TreeListNode> GetNodesByState(this TreeList tree, CheckState state, Func<TreeListNode, bool> GetNodesByStateRule)
255   {
256 if (tree == null)
257 throw new ArgumentNullException("tree");
258   List<TreeListNode> _checkNodes = new List<TreeListNode>();
259   tree.LoopTree((TreeListNode node) =>
260   {
261 if (GetNodesByStateRule(node))
262   {
263 if (node.CheckState == state)
264   _checkNodes.Add(node);
265   }
266   });
267 return _checkNodes;
268   }
269   }
270 }
原文地址:https://www.cnblogs.com/endv/p/4585166.html