使用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 //初始化方法加载测试数据 22 private void FrmTreeList_Load(object sender, EventArgs e) 23 { 24 DataTable dt = new DataTable(); 25 dt.Columns.Add("ID", typeof(int)); 26 dt.Columns.Add("ItemName", typeof(string)); 27 dt.Columns.Add("ParentID", typeof(int)); 28 DataRow dr = dt.NewRow(); 29 dr["ID"] = 1; 30 dr["ItemName"] = "根节点"; 31 dr["ParentID"] = -1; 32 dt.Rows.Add(dr); 33 DataRow dr2 = dt.NewRow(); 34 dr2["Id"] = 2; 35 dr2["ItemName"] = "根节点2"; 36 dr2["ParentID"] = 0; 37 dt.Rows.Add(dr2); 38 DataRow dr3 = dt.NewRow(); 39 dr3["ID"] = 3; 40 dr3["ItemName"] = "根节点3"; 41 dr3["ParentID"] = 0; 42 dt.Rows.Add(dr3); 43 44 DataRow dr4 = dt.NewRow(); 45 dr4["ID"] = 4; 46 dr4["ItemName"] = "子节点1"; 47 dr4["ParentID"] = 1; 48 dt.Rows.Add(dr4); 49 50 DataRow dr5 = dt.NewRow(); 51 dr5["ID"] = 5; 52 dr5["ItemName"] = "子节点2"; 53 dr5["ParentID"] = 1; 54 dt.Rows.Add(dr5); 55 56 DataRow dr6 = dt.NewRow(); 57 dr6["ID"] = 6; 58 dr6["ItemName"] = "子节点2"; 59 dr6["ParentID"] = 5; 60 dt.Rows.Add(dr6); 61 62 this.treeList1.DataSource = dt; 63 64 //这里是用来测试的节点 65 selectItem.Add("子节点1"); 66 selectItem.Add("根节点2"); 67 // 设置初始状态 68 SetCheckState(); 69 70 } 71 72 /// <summary> 73 /// 要被选中的节点 74 /// </summary> 75 private List<string> selectItem = new List<string>(); 76 77 //设置节点的选中状态 78 private void SetCheckState() 79 { 80 foreach (TreeListNode n in treeList1.Nodes) 81 { 82 DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n); 83 string nodeName = string.Empty; 84 if (drv != null) 85 { 86 nodeName = drv["ItemName"] != null ? Convert.ToString(drv["ItemName"]) : ""; 87 } 88 bool checkd = selectItem.Contains(nodeName); 89 if (checkd) 90 n.CheckState = CheckState.Checked; 91 //如果当前结点有子结点集合,再枚举所有子结点 92 if (n.HasChildren) 93 this.SetChildNodeState(n); 94 } 95 96 } 97 98 /// <summary> 99 /// 设置子节点状态 100 /// </summary> 101 /// <param name="parentNode"></param> 102 private void SetChildNodeState(TreeListNode parentNode) 103 { 104 foreach (TreeListNode n in parentNode.Nodes) 105 { 106 DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n); 107 string nodeName = string.Empty; 108 if (drv != null) 109 { 110 nodeName = drv["ItemName"] != null ? Convert.ToString(drv["ItemName"]) : ""; 111 } 112 bool checkd = selectItem.Contains(nodeName); 113 if (checkd) 114 { 115 parentNode.CheckState = CheckState.Checked; 116 n.CheckState = CheckState.Checked; 117 } 118 if (n.HasChildren) 119 this.SetChildNodeState(n); 120 } 121 } 122 123 124 125 //节点选中后处理 126 private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) 127 { 128 SetChildrenNodeState(e.Node, e.Node.CheckState); 129 SetParentNode(e.Node); 130 } 131 132 //设置父节点的状态 133 private void SetChildrenNodeState(TreeListNode node, CheckState state) 134 { 135 node.CheckState = state; 136 if (node.HasChildren) 137 { 138 SetChildNodeState(node, state); 139 } 140 } 141 //设置子节点的状态(当选中父节点时所有的子节点也要选中) 142 private void SetChildNodeState(TreeListNode node, CheckState state) 143 { 144 foreach (TreeListNode item in node.Nodes) 145 { 146 item.CheckState = state; 147 if (item.HasChildren) 148 { 149 SetChildNodeState(item, state); 150 } 151 } 152 } 153 154 //检查节点是否是最后一个被选中或取消的子节点,如果是要对父节点进行设置(选中或不选中) 155 private void SetParentNode(TreeListNode node) 156 { 157 if (node.ParentNode != null) 158 { 159 bool state = true; 160 foreach (TreeListNode item in node.ParentNode.Nodes) 161 { 162 if (item.CheckState != node.CheckState) 163 { 164 state = false; 165 break; 166 } 167 } 168 if (state) 169 { 170 node.ParentNode.CheckState = node.CheckState; 171 } 172 } 173 } 174 } 175 }View Code