原創(chuàng)|其它|編輯:郝浩|2011-06-17 11:47:34.000|閱讀 16786 次
概述:工作中經(jīng)常用的的是第三發(fā)控件DevExpress,相信大家都知道它的強大功能,這次用到了TreeList做了一個權限的管理,發(fā)現(xiàn)TreeList非常好用,大家可以看它自帶的 Demo就知道了
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
工作中經(jīng)常用的的是第三發(fā)控件DevExpress,相信大家都知道它的強大功能,這次用到了TreeList做了一個權限的管理,發(fā)現(xiàn)TreeList非常好用,大家可以看它自帶的 Demo就知道了,功能很多,這里我就把我用到的說出來,大家一起交流學習。
TreeList有一個KeyFieldName和ParentFieldName,這2個非常重要,只要構造一個DataTable賦值給 TreeList的DataSource,這個DataTable里面要有2列是必須的,因為這2列要賦給上面說的KeyFieldName和 ParentFieldName,先不說上面意思,樹應該是從根節(jié)點遞歸、遞歸、一直往下遞歸到葉子,KeyFieldName和 ParentFieldName就起到這個作用,比如:下面的一個DataTable:
KeyFieldName | ParentFieldName | NodeName | NodeCode | Others |
1 | Null | 根節(jié)點1名稱 | 根節(jié)點1編碼 | 其他 |
2 | 1 | 節(jié)點1子節(jié)點名稱 | 節(jié)點1子節(jié)點編碼 | 其他 |
3 | 1 | 節(jié)點1子節(jié)點名稱 | 節(jié)點1子節(jié)點編碼 | 其他 |
4 | Null | 根節(jié)點4名稱 | 根節(jié)點4編碼 | 其他 |
5 | 4 | 節(jié)點4子節(jié)點名稱 | 節(jié)點4子節(jié)點編碼 | 其他 |
6 | 5 | 節(jié)點5子節(jié)點名稱 | 節(jié)點5子節(jié)點編碼 | 其他 |
這時,如果把這個DataTable賦給TreeList的話,就會產(chǎn)生下面的一棵樹:
下面是一個構造TreeList的數(shù)據(jù)源的簡單示例:
/// <summary> /// 構造一棵樹型表結構 /// </summary> /// <returns></returns> 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的構架,但是里面是沒有任何數(shù)據(jù)的 DataRow dr1 = dt.NewRow(); dr1["KeyFieldName"] = 1; dr1["ParentFieldName"] = DBNull.Value; dr1["NodeName"] = "根節(jié)點名稱"; dr1["NodeCode"] = "根節(jié)點編碼"; dr1["Others"] = "其他"; dt.Rows.Add(dr1); DataRow dr2 = dt.NewRow(); dr2["KeyFieldName"] = 2; dr2["ParentFieldName"] = 1; dr2["NodeName"] = "節(jié)點子節(jié)點名稱"; dr2["NodeCode"] = "節(jié)點子節(jié)點編碼"; dr2["Others"] = "其他"; dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow(); dr3["KeyFieldName"] = 3; dr3["ParentFieldName"] = 1; dr3["NodeName"] = "節(jié)點子節(jié)點名稱"; dr3["NodeCode"] = "節(jié)點子節(jié)點編碼"; dr3["Others"] = "其他"; dt.Rows.Add(dr3); DataRow dr4 = dt.NewRow(); dr4["KeyFieldName"] = 4; dr4["ParentFieldName"] = DBNull.Value; dr4["NodeName"] = "根節(jié)點名稱"; dr4["NodeCode"] = "根節(jié)點編碼"; dr4["Others"] = "其他"; dt.Rows.Add(dr4); DataRow dr5 = dt.NewRow(); dr5["KeyFieldName"] = 5; dr5["ParentFieldName"] = 4; dr5["NodeName"] = "節(jié)點子節(jié)點名稱"; dr5["NodeCode"] = "節(jié)點子節(jié)點編碼"; dr5["Others"] = "其他"; dt.Rows.Add(dr5); DataRow dr6 = dt.NewRow(); dr6["KeyFieldName"] = 6; dr6["ParentFieldName"] = 5; dr6["NodeName"] = "節(jié)點子節(jié)點名稱"; dr6["NodeCode"] = "節(jié)點子節(jié)點編碼"; dr6["Others"] = "其他"; dt.Rows.Add(dr6); return dt; }
好了,一個TreeList構造完成,下面就是TreeList的一些常用用法,都比較簡單,這里就直接上代碼了,代碼中有簡單的注釋,大家一看就明白哦。
/// <summary> /// 點擊節(jié)點前 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void treeLstModuleAction_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e) { e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked); } /// <summary> /// 點擊節(jié)點后 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void treeLstModuleAction_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) { SetCheckedChildNodes(e.Node, e.Node.CheckState); SetCheckedParentNodes(e.Node, e.Node.CheckState); } /// <summary> /// 選擇子節(jié)點時觸發(fā) /// </summary> /// <param name="node"></param> /// <param name="check"></param> 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); } } /// <summary> /// 選擇父節(jié)點時觸發(fā) /// </summary> /// <param name="node"></param> /// <param name="check"></param> 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); } } /// <summary> /// 判斷此節(jié)點下的所有孩子節(jié)點是否選中 /// </summary> /// <param name="node"></param> /// <returns></returns> 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的一些常用用法就說到這了,大家如果有好的想法,請不吝賜教,謝謝!
本站文章除注明轉載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網(wǎng)絡轉載