使用DEV控件也有一段时间了,一直想写点东西。最近又使用到TreeList控件,这个控件对于刚使用的人来说确实不好掌握。我想把自己知道的写下来,让还不熟悉的慢慢学会使用,对于会使用的大家交流下。如果有用的不正确或不恰当的欢迎各位指正批评。
一,第一步从控件库里拖出TreeList
二,设置属性
this.treeList1.OptionsView.ShowCheckBoxes = true;
this.treeList1.OptionsView.ShowColumns = false;
this.treeList1.OptionsView.ShowHorzLines = false;
this.treeList1.OptionsView.ShowIndicator = false;
this.treeList1.OptionsView.ShowVertLines = false;
三,构造测试数据(参考方法 FrmTreeList_Load)
四,设置选中项(参考方法 SetCheckState )
五,当前操作的节点为某个节点的最后一个子节点时,设置父节点的状态
这里需要一个 事件即:treeList1_AfterCheckNode 这个方法在属性事件里找到。
页面所有代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using DevExpress.XtraTreeList.Nodes; 11 12 namespace WinForm2 13 { 14 public partial class FrmTreeList : DevExpress.XtraEditors.XtraForm 15 { 16 public FrmTreeList() 17 { 18 InitializeComponent(); 19 } 20 21 private DataTable dt = new DataTable(); 22 /// <summary> 23 /// 要被选中的节点 24 /// </summary> 25 public List<string> SelectItem = new List<string>(); 26 27 //初始化方法加载测试数据 28 private void FrmTreeList_Load(object sender, EventArgs e) 29 { 30 dt.Columns.Add("ID", typeof(int)); 31 dt.Columns.Add("ItemName", typeof(string)); 32 dt.Columns.Add("ParentID", typeof(int)); 33 34 DataRow dr = dt.NewRow(); 35 dr["ID"] = 1; 36 dr["ItemName"] = "根节点"; 37 dr["ParentID"] = -1; 38 dt.Rows.Add(dr); 39 40 DataRow dr2 = dt.NewRow(); 41 dr2["Id"] = 2; 42 dr2["ItemName"] = "根节点2"; 43 dr2["ParentID"] = 0; 44 dt.Rows.Add(dr2); 45 46 DataRow dr3 = dt.NewRow(); 47 dr3["ID"] = 3; 48 dr3["ItemName"] = "根节点3"; 49 dr3["ParentID"] = 0; 50 dt.Rows.Add(dr3); 51 52 DataRow dr4 = dt.NewRow(); 53 dr4["ID"] = 4; 54 dr4["ItemName"] = "子节点1"; 55 dr4["ParentID"] = 1; 56 dt.Rows.Add(dr4); 57 58 DataRow dr5 = dt.NewRow(); 59 dr5["ID"] = 5; 60 dr5["ItemName"] = "子节点2"; 61 dr5["ParentID"] = 1; 62 dt.Rows.Add(dr5); 63 64 DataRow dr6 = dt.NewRow(); 65 dr6["ID"] = 6; 66 dr6["ItemName"] = "子子节点1"; 67 dr6["ParentID"] = 5; 68 dt.Rows.Add(dr6); 69 70 DataRow dr7 = dt.NewRow(); 71 dr7["ID"] = 7; 72 dr7["ItemName"] = "子子节点2"; 73 dr7["ParentID"] = 5; 74 dt.Rows.Add(dr7); 75 76 this.treeList1.DataSource = dt; 77 this.treeList1.KeyFieldName = "ID"; 78 this.treeList1.ParentFieldName = "ParentID"; 79 80 //这里是用来测试的节点 81 SelectItem.Add("子子节点1"); 82 SelectItem.Add("根节点2"); 83 // 设置初始状态 84 SetCheckState(SelectItem, "ItemName"); 85 86 } 87 88 #region 按配置选中相关节点项 89 90 //设置节点的选中状态 91 private void SetCheckState(List<string> list, string fieldName) 92 { 93 foreach (TreeListNode n in treeList1.Nodes) 94 { 95 DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n); 96 string nodeName = (drv != null && drv[fieldName] != null) ? Convert.ToString(drv[fieldName]) : string.Empty; 97 if (list.Contains(nodeName)) 98 { 99 n.CheckState = CheckState.Checked; 100 } 101 //如果当前结点有子结点,再枚举所有子结点 102 if (n.HasChildren) 103 this.SelectedChildNode(n, fieldName); 104 } 105 106 } 107 108 /// <summary> 109 /// 设置子节点状态 110 /// </summary> 111 /// <param name="parentNode"></param> 112 private void SelectedChildNode(TreeListNode parentNode, string fieldName) 113 { 114 foreach (TreeListNode n in parentNode.Nodes) 115 { 116 DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n); 117 string nodeName = (drv != null && drv[fieldName] != null) ? Convert.ToString(drv[fieldName]) : string.Empty; 118 if (SelectItem.Contains(nodeName)) 119 { 120 n.CheckState = CheckState.Checked; 121 // 这里是将父节点,父节点的父节点设置为选中状态 122 SelectedParentNode(n); 123 } 124 if (n.HasChildren) this.SelectedChildNode(n, fieldName); 125 } 126 } 127 128 /// <summary> 129 /// 设置相关的父节点被选中 130 /// </summary> 131 /// <param name="parentNode"></param> 132 private void SelectedParentNode(TreeListNode parentNode) 133 { 134 if (parentNode.ParentNode != null) 135 { 136 parentNode.ParentNode.CheckState = CheckState.Checked; 137 SelectedParentNode(parentNode.ParentNode); 138 } 139 } 140 141 #endregion 142 143 #region 节点选中或取消相关处理 144 145 //节点选中后处理 146 private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) 147 { 148 SetChildNodeState(e.Node, e.Node.CheckState); 149 SetParentNodeState(e.Node); 150 } 151 152 //设置子节点的状态(当选中父节点时所有的子节点也要选中) 153 private void SetChildNodeState(TreeListNode node, CheckState state) 154 { 155 if (node.HasChildren) 156 { 157 foreach (TreeListNode item in node.Nodes) 158 { 159 item.CheckState = state; 160 if (item.HasChildren) SetChildNodeState(item, state); 161 } 162 } 163 } 164 165 //检查节点是否是最后一个被选中或取消的子节点,如果是要对父节点进行设置(选中或不选中) 166 private void SetParentNodeState(TreeListNode node) 167 { 168 if (node.ParentNode != null) 169 { 170 // 方法一 171 //bool state = false; 172 //foreach (TreeListNode item in node.ParentNode.Nodes) 173 //{ 174 // state = item.Checked; 175 // if (state) break; 176 //} 177 //node.ParentNode.Checked = state; 178 179 // 方法二 180 bool state = true; 181 node.ParentNode.CheckState = CheckState.Checked; 182 foreach (TreeListNode item in node.ParentNode.Nodes) 183 { 184 if (item.CheckState != node.CheckState) 185 { 186 state = false; 187 break; 188 } 189 } 190 if (state) node.ParentNode.CheckState = node.CheckState; 191 192 // 递归检查父父节点 193 SetParentNodeState(node.ParentNode); 194 } 195 } 196 197 #endregion 198 199 // 设置选中项的背景 200 private void treeList1_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e) 201 { 202 if (e.Node.Checked) 203 { 204 e.Appearance.BackColor = Color.LightBlue; 205 } 206 else 207 { 208 e.Appearance.BackColor = Color.Transparent; 209 } 210 } 211 } 212 }