一、参考链接:

https://www.cnblogs.com/badaoliumangqizhi/p/11737850.html

二、理解

简洁的来说,DevExpress中的TreeList可以用多种方式绑定数据源,比如说利用表的形式转换成树形结构
或者自定义一种至少包含,主键ID,父节点ID和节点内容的数据类型(C#中的类)
可以说主键就是每个人的身份证ID,父键就是父亲的身份证ID,
当然每个人的ID只能有唯一的一个,

所以DataSource我们可以用List保存类
DevExpress可以指定TreeList的KeyFieldName和ParentFieldName就可以自动帮我们排列好树形结构

三、类

网上的类是这样的

  1. public class DataTreeNode
  2. {
  3. public DataTreeNode()
  4. {
  5. }
  6. public DataTreeNode(string Id,string ParentId,string NodeText)
  7. {
  8. this.Id = Id;
  9. this.ParentId = ParentId;
  10. this.NodeText = NodeText;
  11. }
  12. private string id;
  13. private string parentId;
  14. private string nodeText;
  15. public string Id
  16. {
  17. get { return id; }
  18. set { id = value; }
  19. }
  20. public string ParentId
  21. {
  22. get { return parentId; }
  23. set { parentId = value; }
  24. }
  25. public string NodeText
  26. {
  27. get { return nodeText; }
  28. set { nodeText = value; }
  29. }
  30. }

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.
image.png
四、父子节点互相影响事件
AfterCheckNode、BeforeCheckNode

  1. /// <summary>
  2. /// 设置子节点的状态
  3. /// </summary>
  4. /// <param name="node"></param>
  5. /// <param name="check"></param>
  6. private void SetCheckedChildNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)
  7. {
  8. for (int i = 0; i < node.Nodes.Count; i++)
  9. {
  10. node.Nodes[i].CheckState = check;
  11. SetCheckedChildNodes(node.Nodes[i], check);
  12. }
  13. }
  14. /// <summary>
  15. /// 设置父节点的状态
  16. /// </summary>
  17. /// <param name="node"></param>
  18. /// <param name="check"></param>
  19. private void SetCheckedParentNodes(DevExpress.XtraTreeList.Nodes.TreeListNode node, CheckState check)
  20. {
  21. if (node.ParentNode != null)
  22. {
  23. bool b = false;
  24. CheckState state;
  25. for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
  26. {
  27. state = (CheckState)node.ParentNode.Nodes[i].CheckState;
  28. if (!check.Equals(state))
  29. {
  30. b = !b;
  31. break;
  32. }
  33. }
  34. node.ParentNode.CheckState = b ? CheckState.Indeterminate : check;
  35. SetCheckedParentNodes(node.ParentNode, check);
  36. }
  37. }
  38. private void treeList1_AfterCheckNode(object sender, NodeEventArgs e)
  39. {
  40. SetCheckedChildNodes(e.Node, e.Node.CheckState);
  41. SetCheckedParentNodes(e.Node, e.Node.CheckState);
  42. }
  43. private void treeList1_BeforeCheckNode(object sender, CheckNodeEventArgs e)
  44. {
  45. e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
  46. }