DevExpress.XtraTreeList.TreeList (樹控制元件使用說明)
阿新 • • 發佈:2019-02-01
/// <summary> /// 二級選單點選,初始化樹 /// </summary> private void InitRightTree() { m_panelRight.Controls.Clear(); // m_panelRight.Visible = true; DevExpress.XtraTreeList.TreeList treeList = new DevExpress.XtraTreeList.TreeList(); treeList.OptionsView.ShowCheckBoxes = true; treeList.Dock = DockStyle.Fill; m_panelRight.Controls.Add(treeList); DataTable dt = GetTestData(); treeList.DataSource = dt; ////設定樹的ParentFieldName 屬性 ////設定樹的KeyFieldName 屬性 treeList.ParentFieldName = "ParentFieldName"; treeList.KeyFieldName = "KeyFieldName"; } /// <summary> /// 此處獲得繫結樹的資料 /// </summary> /// <returns></returns> private DataTable GetTestData() { DataTable dt = new DataTable(); DataColumn dc = new DataColumn("KeyFieldName"); DataColumn dc3 = new DataColumn("ParentFieldName"); DataColumn dc2 = new DataColumn("name"); dt.Columns.Add(dc); dt.Columns.Add(dc2); dt.Columns.Add(dc3); for (int i = 0; i < 100; i++) { DataRow dr = dt.NewRow(); dr["KeyFieldName"] = i; dr["ParentFieldName"] = (i % 5 == 0 ? "Null" : (i % 5).ToString()); dr["name"] = i + "haha"; dt.Rows.Add(dr); } return dt; }
//////////////////////////////////////////////////////////////////////
樹形控制元件是使用頻率很高的一種控制元件。對於屬性控制元件往往需要下面兩個功能 1.TreeList帶有CheckBox,並且節點要有三種狀態(所有的子節點都選中,所有的子節點都沒選擇,一部分子節點選中)。使用DevXpress的TreeList控制元件很容易實現這一功能。 設定TreeList.OptionsView.ShowCheckBoxes = true //是否顯示CheckBox 設定TreeList.OptionsBehavior.AllowIndeterminateCheckState = true; //設定節點是否有中間狀態,即一部分子節點選中,一部分子節點沒有選中 設定這兩個屬性之後就實現了TreeList帶有CheckBox,並且節點有三種狀態。 2.選中父節點或者子節點相互影響的功能,如選擇父節點選擇所有子節點。繫結TreeList的兩個事件AfterCheckNode和BeforeCheckNode 實現功能的程式碼如下:
private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e) { SetCheckedChildNodes(e.Node, e.Node.CheckState); SetCheckedParentNodes(e.Node, e.Node.CheckState); } private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e) { e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked); } /// <summary> /// 設定子節點的狀態 /// </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> /// 設定父節點的狀態 /// </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); } }