DevExpress TreeList控件的複選框
TreeList控件可以同時顯示樹結構和其他數據列,即在一個列上建立父子關係展開或收縮,同時還可以顯示其他列的內容。
在TreeList中同時引入了 Node和 Columns概念, 第一列為樹結構, 其餘列為數據列, 任何列都可作為樹結構列(即拖動到第一列)顯示。
實現多級樹---數據源綁定
在TreeList裏添加要顯示列(第一列為樹結構,其他列為數據列),並指定FieldName為數據庫列名
指定KeyFieldName屬性為主鍵,ParentFieldName屬性為樹狀分組列。注意 ParentFieldName指定的列如果為空值,樹狀可能會混亂(隻有一個根結點,其他為此節點的子結點)
用TreeList.DataSource = DataTable 綁定數據即可
樹形控件是使用頻率很高的一種控件。對於屬性控件往往需要下麵兩個功能:
1.TreeList帶有CheckBox,並且節點要有三種狀態(所有的子節點都選中,所有的子節點都沒選擇,一部分子節點選中)。使用DevXpress的TreeList控件很容易實現這一功能。
設置TreeList.OptionsView.ShowCheckBoxes = true //是否顯示CheckBox
設置TreeList.OptionsBehavior.AllowIndeterminateCheckState = true; //設置節點是否有中間狀態,即一部分子節點選中,一部分子節點沒有選中
設置這兩個屬性之後就實現了TreeList帶有CheckBox,並且節點有三種狀態。
2.選中父節點或者子節點相互影響的功能,如選擇父節點選擇所有子節點。綁定TreeList的兩個事件AfterCheckNode和BeforeCheckNode
DevExpress的TreeList要想在節點前麵顯示複選框,得修改屬性OptionsView->ShowCheckBoxes=True
複選框的子節點與父節點統一的規則有:
1、選擇某一節點時,該節點的子節點全部選擇
2、取消某一節點時,該節點的子節點全部取消選擇
3、某節點的子節點全部選擇時,該節點選擇
4、某節點的子節點未全部選擇時,該節點不選擇
#region 節點選中前事件
private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
{
if (e.PrevState == CheckState.Checked)
{
e.State = CheckState.Unchecked;
}
else
{
e.State = CheckState.Checked;
}
}
#endregion
#region 節點選中後事件
private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
#endregion
#region 設置子節點狀態
private void SetCheckedChildNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)
{
for (int i = 0; i < node.Nodes.Count; i++)
{
node.Nodes[i].CheckState = check;
SetCheckedChildNodes(node.Nodes[i], check);
}
}
#endregion
#region 設置父節點狀態
private void SetCheckedParentNodes(DevExpress.XtraTreeList.Nodes.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;
}
}
if (b)
{
node.ParentNode.CheckState = CheckState.Indeterminate;
}
else
{
node.ParentNode.CheckState = check;
}
SetCheckedParentNodes(node.ParentNode, check);
}
}
#endregion
最後更新:2017-04-03 12:56:21