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 }