Goto Tree List 树列表
Custom Nodes 自定义节点
自定义节点是 TreeListNode 的后代,允许您扩展默认节点功能。本主题介绍如何创建自定义节点并在 Tree List 控件中使用它们。
Custom Nodes 自定义节点
树列表控件(TreeListNode 对象)的节点不是直接创建的。Tree List 控件不调用 TreeListNode 构造函数。相反,每次需要创建新节点时,它都会调用受保护的 CreateNode 方法。此方法具有以下语法:
protected virtual TreeListNode CreateNode(int nodeID, TreeListNodes owner);
该方法必须返回新创建的节点。nodeID 和 owner 参数指定节点的标识符和拥有集合。第一个参数对应于 TreeListNode.Id 属性。第二个参数是父节点的 TreeListNode.Nodes 属性值。(如果创建了根级别节点,则 owner 参数等于 TreeList.Nodes 属性值。
以下技术允许您创建自定义节点:
- 创建具有所需功能的 TreeListNode 后代。
- 创建 TreeList 控件后代,并重写 CreateNode 方法,以返回新创建的自定义类型的节点。
- 将派生控件添加到窗体中。
Example 例
此示例说明如何创建引入 Height 属性的自定义节点类。此属性将允许为单个节点设置高度。

using DevExpress.XtraTreeList;
using DevExpress.XtraTreeList.Nodes;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CustomTreeList_NodeHeight {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
List<MyRecord> list = new List<MyRecord>();
list.Add(new MyRecord(0, -1, "Corporate Headquarters", 1000000, "Monterey"));
list.Add(new MyRecord(1, 0, "Sales and Marketing", 22000, "San Francisco"));
list.Add(new MyRecord(2, 0, "Finance", 40000, "Monterey"));
list.Add(new MyRecord(3, 0, "Engineering", 1100000, "Monterey"));
list.Add(new MyRecord(4, -1, "Customer Services", 850000, "Burlington, VT"));
treeList1.DataSource = list;
treeList1.Columns["Budget"].Format.FormatType = DevExpress.Utils.FormatType.Numeric;
treeList1.Columns["Budget"].Format.FormatString = "c0";
}
private void Form1_Load(object sender, EventArgs e) {
treeList1.ForceInitialize();
treeList1.ExpandAll();
((MyTreeListNode)treeList1.Nodes[0]).Height = 35;
((MyTreeListNode)treeList1.Nodes[0].Nodes[1]).Height = 35;
}
}
public class MyTreeList : TreeList {
public MyTreeList() : base() {
OptionsBehavior.AutoNodeHeight = false;
}
protected override TreeListNode CreateNode(int nodeID, TreeListNodes owner, object tag) {
return new MyTreeListNode(nodeID, owner);
}
protected override void InternalNodeChanged(TreeListNode node, TreeListNodes nodes, NodeChangeTypeEnum changeType) {
if (changeType == NodeChangeTypeEnum.User1)
LayoutChanged();
base.InternalNodeChanged(node, nodes, changeType);
}
protected override void RaiseCalcNodeHeight(TreeListNode node, ref int nodeHeight) {
MyTreeListNode myNode = node as MyTreeListNode;
if (myNode != null)
nodeHeight = myNode.Height;
else
base.RaiseCalcNodeHeight(node, ref nodeHeight);
}
public virtual int DefaultNodesHeight { get { return 18; } }
}
public class MyTreeListNode : TreeListNode {
const int minHeight = 5;
int height;
public MyTreeListNode(int id, TreeListNodes owner) : base(id, owner) {
this.height = (owner.TreeList as MyTreeList).DefaultNodesHeight;
}
public int Height {
get { return height; }
set {
if (Height == value || value < minHeight) return;
height = value;
Changed(NodeChangeTypeEnum.User1);
}
}
}
public class MyRecord {
public int ID { get; set; }
public int ParentID { get; set; }
public string Department { get; set; }
public string Location { get; set; }
public decimal Budget { get; set; }
public MyRecord(int id, int parentID, string department, decimal budget, string location) {
ID = id;
ParentID = parentID;
Department = department;
Budget = budget;
Location = location;
}
}
}
Tree List 控件自定义节点创建方法
928

被折叠的 条评论
为什么被折叠?



