TreeList个人总结

摘要:
最近项目中要求用dev控件的treelist树形控件。如下图要求如下:1:选择父节点后,子节点全部打钩;2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状态。

最近项目中要求用dev 控件的treelist 树形控件。

如下图

TreeList个人总结第1张

要求如下:

1:选择父节点后,子节点全部打钩;

2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状态。

具体实现如下:

一、treelist绑定的数据源是数据集(dateset)中的表,而且必须给:(当前节点id)KeyFieldName和(上一级节点id)ParentFieldName 两个属性绑定字段。

二、设置treelist1(名称)中OptionView—ShowCheckBoxes属性为true,则每个节点前面自动增加一个check框。

三、设置OptionBehavior—AllIndeterminateCheckState属性为true,则check框可以出现半选状态。

四、

代码
1privatevoidtreeList1_AfterCheckNode(objectsender,DevExpress.XtraTreeList.NodeEventArgse)
2{
3if(e.Node==null)return;
4System.Data.DataRowViewrov=treeList1.GetDataRecordByNode(e.Node)asSystem.Data.DataRowView;
5if(e.Node.CheckState==CheckState.Indeterminate)
6{
7e.Node.CheckState=CheckState.Checked;
8}
9if(e.Node.CheckState==CheckState.Checked)
10{
11if(e.Node.HasChildren)
12{
13CheckNode(e.Node);
14}
15ValidParentIsChecked(e.Node);
16}
17elseif(e.Node.CheckState==CheckState.Unchecked)
18{
19if(e.Node.HasChildren)
20{
21ClearNode(e.Node);
22}
23//从根节点往下查询是否有打钩的子节点,如果有那么父节点的半选状态不变否则变为不选择状态24ValidParentNodeIsCanleSel(e.Node);
25}
26}
27
代码
1privatevoidCheckNode(DevExpress.XtraTreeList.Nodes.TreeListNodenode)
2{
3foreach(DevExpress.XtraTreeList.Nodes.TreeListNodecnodeinnode.Nodes)
4{
5if(cnode!=null)
6{
7cnode.CheckState=CheckState.Checked;
8}
9if(cnode.HasChildren)
10{
11CheckNode(cnode);
12}
13}
14}
代码
///<summary>///</summary>///<paramname="node"></param>///<returns></returns>privatevoidValidParentIsChecked(DevExpress.XtraTreeList.Nodes.TreeListNodenode)
{
if(node.ParentNode!=null)
{
if(node.ParentNode.CheckState!=CheckState.Checked)
node.ParentNode.CheckState
=CheckState.Indeterminate;
ValidParentIsChecked(node.ParentNode);
}
}
代码
privatevoidValidParentNodeIsCanleSel(DevExpress.XtraTreeList.Nodes.TreeListNodenode)
{
boolisSel=false;
if(node.ParentNode!=null)
{
if(node.ParentNode.CheckState==CheckState.Indeterminate)
{
//如果父节点的状态为半选状态这更具父节点判断子节点是否打钩isSel=ValidIsHasCheckChildNode(node.ParentNode);
if(isSel==false)
{
//如果所有的子节点都没有“选中”那么父节点的状态变为非选中状态node.ParentNode.CheckState=CheckState.Unchecked;
}
}
ValidParentNodeIsCanleSel(node.ParentNode);
}
}
///<summary>///判断子节点是否有状态为“选中”状态
///true表示有false表示为没有
///</summary>///<paramname="node"></param>///<returns></returns>privateboolValidIsHasCheckChildNode(DevExpress.XtraTreeList.Nodes.TreeListNodenode)
{
boolisCheck=false;
foreach(DevExpress.XtraTreeList.Nodes.TreeListNodecnodeinnode.Nodes)
{
if(cnode!=null)
{
if(cnode.CheckState==CheckState.Checked)
{
isCheck
=true;
returnisCheck;
}
}
if(cnode.HasChildren)
{
isCheck
=ValidIsHasCheckChildNode(cnode);
if(isCheck==true)
{
returnisCheck;
}
}
}
returnisCheck;
}

五、通过treelist的 node节点 可以得到当前节点对应的行

System.Data.DataRowView rov = treeList1.GetDataRecordByNode(node) as System.Data.DataRowView;

六、如果想让treelist的check框不可编辑,我用到的办法是:在“BeforeCheckNode”这个事件中给出判断

private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
{
//验证并判断 treelist 是否可编辑(默认的可编辑的) ---2010/09/06上海修改
if (ValidOrgTreeIsEdit == false)
e.CanCheck = false;
else
{
e.CanCheck = true;
}
}

七、如果想 一个 node 绑定是 name 字段,但是显示为:code+name 可以在(CustomDrawNodeCell)这个事件中写方法

代码
privatevoidTreeCat_CustomDrawNodeCell(objectsender,DevExpress.XtraTreeList.CustomDrawNodeCellEventArgse)
{
if(e.CellValue==null)return;
if(e.Node==null)return;
if(e.Column.Equals(name))
{
if(e.CellValue.ToString().Trim()!=string.Empty)
{
System.Data.DataRowViewrov
=treeList1.GetDataRecordByNode(e.Node)asSystem.Data.DataRowView;
if(rov!=null)
{
e.CellText
=rov["code"].ToString().Trim()+"-"+rov["name"].ToString().Trim();
}
}
}
}

以上就是目前对treelist的一些基本操作。主要是用到递归方法实现对节点的控制。

免责声明:文章转载自《TreeList个人总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转载】比特币入门教程Electromagnetic radiation and Radio 电磁波/电磁辐射和无线电波下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章