一、参考链接:
https://www.cnblogs.com/badaoliumangqizhi/p/11737850.html
二、理解
简洁的来说,DevExpress中的TreeList可以用多种方式绑定数据源,比如说利用表的形式转换成树形结构
或者自定义一种至少包含,主键ID,父节点ID和节点内容的数据类型(C#中的类)
可以说主键就是每个人的身份证ID,父键就是父亲的身份证ID,
当然每个人的ID只能有唯一的一个,
所以DataSource我们可以用List保存类
DevExpress可以指定TreeList的KeyFieldName和ParentFieldName就可以自动帮我们排列好树形结构
三、类
网上的类是这样的
public class DataTreeNode
{
public DataTreeNode()
{
}
public DataTreeNode(string Id,string ParentId,string NodeText)
{
this.Id = Id;
this.ParentId = ParentId;
this.NodeText = NodeText;
}
private string id;
private string parentId;
private string nodeText;
public string Id
{
get { return id; }
set { id = value; }
}
public string ParentId
{
get { return parentId; }
set { parentId = value; }
}
public string NodeText
{
get { return nodeText; }
set { nodeText = value; }
}
}
xml文件即是一种属性结构
当定义第一个节点—即根节点的时候
DataTreeNode node1 = new DataTreeNode(id.ToString(), null, “Ancestor”);
treeNodes.Add(node1);//添加节点
第一个节点的父节点就命名为null
下列示意图左侧指的是该节点的主键ID,右侧是他的父节点ID
Justin自己的ID为1,父节点为null
Alan、Tom、Henry的ID为2、4、7,而他们的父节点ID都为1.
四、父子节点互相影响事件
AfterCheckNode、BeforeCheckNode
/// <summary>
/// 设置子节点的状态
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
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);
}
}
/// <summary>
/// 设置父节点的状态
/// </summary>
/// <param name="node"></param>
/// <param name="check"></param>
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;
}
}
node.ParentNode.CheckState = b ? CheckState.Indeterminate : check;
SetCheckedParentNodes(node.ParentNode, check);
}
}
private void treeList1_AfterCheckNode(object sender, NodeEventArgs e)
{
SetCheckedChildNodes(e.Node, e.Node.CheckState);
SetCheckedParentNodes(e.Node, e.Node.CheckState);
}
private void treeList1_BeforeCheckNode(object sender, CheckNodeEventArgs e)
{
e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
}