本示例展示了如何在 非绑定模式 中实现动态数据加载。 这种数据加载模式意味着当应用程序启动时只创建根节点。 当父节点被展开时加载子节点。
在本示例中,本地驱动器中的目录和文件的结构被显示在 TreeList 内。
为了使用动态加载,需要完成三项基本操作:
- 创建用于为特定父节点加载子节点的方法。 这些方法也可以用于填充根节点。 注意,将要包含子节点的节点的 TreeListNode.HasChildren 属性必须被设置为 true。 这样使得这些节点的展开/折叠按钮被显示。
- 在应用程序启动时填充根节点。
- 接管 TreeList.BeforeExpand 事件。 此事件处理程序必须把子节点添加到被展开的节点。
在下面的应用程序示例中将实现所有这些操作。
简单的资源管理器示例
正如上面声明的那样,只能在非绑定模式中实现动态加载。 因此 TreeList.DataSource 属性必须被设置为 null (在 Visual Basic 中为 Nothing),并且必须人工创建列的集合。
在本例中创建了下面的列: FullName、Name、Type、Size 和 Attributes。 FullName 列的 TreeListColumn.VisibleIndex 属性被设置为 -1,使该列不可视。 这是必要的,因为该列的取值指定被显示元素的完整路径。 其取值将用于构造内部子节点列表。
下面的插图展示了如何通过 XtraTreeList 设计器 添加列。
可以使用下面的示例代码来创建相同的列集合。
C# | 复制代码 |
---|---|
string[] captions = {"FullName", "Name", "Type", "Size", "Attributes"}; for (int i = 0; i < 5; i++) { treeList1.Columns.Add(); treeList1.Columns[i].Caption = captions[i]; treeList1.Columns[i].VisibleIndex = (i == 0) ? -1 : i; } |
Visual Basic | 复制代码 |
---|---|
Dim Captions As String() = {"FullName", "Name", "Type", "Size", "Attributes"} Dim i As Integer For i = 0 To 4 TreeList1.Columns.Add() TreeList1.Columns(i).Caption = Captions(i) TreeList1.Columns(i).VisibleIndex = IIf(i = 0, -1, i) Next |
下一步是声明把子节点添加到指定节点的方法。 在下面声明了 InitFolders 方法来完成此操作。 它获取与父节点对应的路径,以及父节点本身作为参数。 当调用此方法来填充根节点时,根节点被指定为第一个参数,null (在 Visual Basic 中为 Nothing) 被传递作为父节点。 每个表示文件夹的节点的 TreeListNode.HasChildren 属性被设置为 true。 这样强制 XtraTreeList 控件为这些节点显示展开按钮。
注意,InitFolders 方法添加对应于指定路径中的文件夹的节点。 它调用 InitFiles 方法来添加相同路径中的文件信息。
C# | 复制代码 |
---|---|
using DevExpress.XtraTreeList.Nodes; using System.IO; // ... private void InitFolders(string path, TreeListNode parentNode) { treeList1.BeginUnboundLoad(); TreeListNode node; DirectoryInfo di; try { string[] root = Directory.GetDirectories(path); foreach(string s in root) { di = new DirectoryInfo(s); node = treeList1.AppendNode(new object[] {s, di.Name, "Folder", null, di.Attributes}, parentNode); node.HasChildren = true; } } catch {} InitFiles(path, parentNode); treeList1.EndUnboundLoad(); } private void InitFiles(string path, TreeListNode parentNode) { TreeListNode node; FileInfo fi; try { string[] root = Directory.GetFiles(path); foreach(string s in root) { fi = new FileInfo(s); node = treeList1.AppendNode(new object[] {s, fi.Name, "File", fi.Length, fi.Attributes}, parentNode); node.HasChildren = false; } } catch {} } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraTreeList.Nodes Imports System.IO '... Private Sub InitFolders(ByVal Path As String, ByVal ParentNode As TreeListNode) TreeList1.BeginUnboundLoad() Dim Node As TreeListNode Dim DI As DirectoryInfo Try Dim Root As String() = Directory.GetDirectories(Path) Dim S As String For Each S In Root DI = New DirectoryInfo(S) Dim Values As Object() = {S, DI.Name, "Folder", Nothing, DI.Attributes} Node = TreeList1.AppendNode(Values, ParentNode) Node.HasChildren = True Next Catch End Try InitFiles(Path, ParentNode) TreeList1.EndUnboundLoad() End Sub Private Sub InitFiles(ByVal Path As String, ByVal ParentNode As TreeListNode) Dim Node As TreeListNode Dim FI As FileInfo Try Dim Root As String() = Directory.GetFiles(Path) Dim S As String For Each S In Root FI = New FileInfo(S) Dim Values As Object() = {S, FI.Name, "File", FI.Length, FI.Attributes} Node = TreeList1.AppendNode(Values, ParentNode) Node.HasChildren = False Next Catch End Try End Sub |
在声明这些方法之后,就可以编写代码来填充根节点。 可以使用下列代码行来达到此目的 (它把“E:\”逻辑驱动器设置为根节点)。
C# | 复制代码 |
---|---|
InitFolders("E:\\", null); |
Visual Basic | 复制代码 |
---|---|
InitFolders("E:\\TreeList\\", Nothing) |
最后一步是实现动态加载。 这包括接管 TreeList.BeforeExpand 事件。 此事件处理程序包含对 InitFolders 方法的单个调用。 传递到此方法的路径由被展开节点内的 FullName 列值指定。 节点自身被作为此方法的父节点传递。
C# | 复制代码 |
---|---|
private void treeList1_BeforeExpand(object sender, DevExpress.XtraTreeList.BeforeExpandEventArgs e) { InitFolders(e.Node.GetDisplayText(0), e.Node); } |
Visual Basic | 复制代码 |
---|---|
Private Sub TreeList1_BeforeExpand(ByVal sender As Object, ByVal e As DevExpress.XtraTreeList.BeforeExpandEventArgs) Handles TreeList1.BeforeExpand InitFolders(e.Node.GetDisplayText(0), e.Node) End Sub |
现在可以运行此应用程序。 当节点被展开时,子节点将被加载。 注意,如果表示文件夹的节点不包含任何子节点,则它的展开按钮将在被单击时消失。
下面的插图显示了在运行时刻的 XtraTreeList 控件。