TreeList有一个KeyFieldName和ParentFieldName,这2个非常重要,只要构造一个DataTable赋值给 TreeList的DataSource,这个DataTable里面要有2列是必须的,因为这2列要赋给上面说的KeyFieldName和 ParentFieldName,先不说上面意思,树应该是从根节点递归、递归、一直往下递归到叶子,KeyFieldName和 ParentFieldName就起到这个作用,比如:下面的一个DataTable:
| KeyFieldName | ParentFieldName | NodeName | NodeCode | Others |
| 1 | Null | 根节点1名称 | 根节点1编码 | 其他 |
| 2 | 1 | 节点1子节点名称 | 节点1子节点编码 | 其他 |
| 3 | 1 | 节点1子节点名称 | 节点1子节点编码 | 其他 |
| 4 | Null | 根节点4名称 | 根节点4编码 | 其他 |
| 5 | 4 | 节点4子节点名称 | 节点4子节点编码 | 其他 |
| 6 | 5 | 节点5子节点名称 | 节点5子节点编码 | 其他 |
这时,如果把这个DataTable赋给TreeList的话,就会产生下面的一棵树:

下面是一个构造TreeList的数据源的简单示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | /// /// 构造一棵树型表结构 /// /// private DataTable CreateTreeListTable() { DataTable dt = new DataTable(); DataColumn dcOID = new DataColumn("KeyFieldName", Type.GetType("System.Int32")); DataColumn dcParentOID = new DataColumn("ParentFieldName", Type.GetType("System.Int32")); DataColumn dcNodeName = new DataColumn("NodeName", Type.GetType("System.String")); DataColumn dcNodeCode = new DataColumn("NodeCode", Type.GetType("System.String")); DataColumn dcOthers = new DataColumn("Others", Type.GetType("System.String")); dt.Columns.Add(dcOID); dt.Columns.Add(dcParentOID); dt.Columns.Add(dcNodeName); dt.Columns.Add(dcNodeCode); dt.Columns.Add(dcOthers); //以上代码完成了DataTable的构架,但是里面是没有任何数据的 DataRow dr1 = dt.NewRow(); dr1["KeyFieldName"] = 1; dr1["ParentFieldName"] = DBNull.Value; dr1["NodeName"] = "根节点名称"; dr1["NodeCode"] = "根节点编码"; dr1["Others"] = "其他"; dt.Rows.Add(dr1); DataRow dr2 = dt.NewRow(); dr2["KeyFieldName"] = 2; dr2["ParentFieldName"] = 1; dr2["NodeName"] = "节点子节点名称"; dr2["NodeCode"] = "节点子节点编码"; dr2["Others"] = "其他"; dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow(); dr3["KeyFieldName"] = 3; dr3["ParentFieldName"] = 1; dr3["NodeName"] = "节点子节点名称"; dr3["NodeCode"] = "节点子节点编码"; dr3["Others"] = "其他"; dt.Rows.Add(dr3); DataRow dr4 = dt.NewRow(); dr4["KeyFieldName"] = 4; dr4["ParentFieldName"] = DBNull.Value; dr4["NodeName"] = "根节点名称"; dr4["NodeCode"] = "根节点编码"; dr4["Others"] = "其他"; dt.Rows.Add(dr4); DataRow dr5 = dt.NewRow(); dr5["KeyFieldName"] = 5; dr5["ParentFieldName"] = 4; dr5["NodeName"] = "节点子节点名称"; dr5["NodeCode"] = "节点子节点编码"; dr5["Others"] = "其他"; dt.Rows.Add(dr5); DataRow dr6 = dt.NewRow(); dr6["KeyFieldName"] = 6; dr6["ParentFieldName"] = 5; dr6["NodeName"] = "节点子节点名称"; dr6["NodeCode"] = "节点子节点编码"; dr6["Others"] = "其他"; dt.Rows.Add(dr6); return dt; } |
好了,一个TreeList构造完成,下面就是TreeList的一些常用用法,都比较简单,这里就直接上代码了,代码中有简单的注释,大家一看就明白哦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 | /// /// 点击节点前 /// /// /// private void treeLstModuleAction_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e) { e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked); } /// /// 点击节点后 /// /// /// private void treeLstModuleAction_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) { SetCheckedChildNodes(e.Node, e.Node.CheckState); SetCheckedParentNodes(e.Node, e.Node.CheckState); } /// /// 选择子节点时触发 /// /// /// private void SetCheckedChildNodes(TreeListNode node, CheckState check) { for (int i = 0; i < node.Nodes.Count; i++) { node.Nodes[i].CheckState = check; SetCheckedChildNodes(node.Nodes[i], check); } } /// /// 选择父节点时触发 /// /// /// private void SetCheckedParentNodes(TreeListNode node, CheckState check) { if (node.ParentNode != null) { bool b = false; CheckState state; for (int i = 0; i < node.ParentNode.Nodes.Count; i++) { state = (CheckState)node.ParentNode.Nodes[i].CheckState; if (!check.Equals(state)) { b = !b; break; } } node.ParentNode.CheckState = b ? CheckState.Indeterminate : check; SetCheckedParentNodes(node.ParentNode, check); } } /// /// 判断此节点下的所有孩子节点是否选中 /// /// /// private Boolean IsChildsChecked(TreeListNode node) { for (int i = 0; i < node.Nodes.Count; i++) { if (node.Nodes[i].CheckState == CheckState.Unchecked) return false; if (node.Nodes[i].HasChildren) IsChildsChecked(node.Nodes[i]); } return true; } |
好了,至此,关于TreeList的一些常用用法就说到这了,大家如果有好的想法,请不吝赐教,谢谢!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29251214/viewspace-774395/ ,如需转载,请注明出处,否则将追究法律责任。