Back to Devexpress

How to: Implement Virtual Mode (Dynamic Loading) in Unbound Mode

windowsforms-325-controls-and-libraries-tree-list-examples-data-binding-how-to-implement-virtual-mode-dynamic-loading-in-unbound-mode.md

latest12.4 KB
Original Source

How to: Implement Virtual Mode (Dynamic Loading) in Unbound Mode

  • Nov 13, 2018
  • 5 minutes to read

This example demonstrates how to show the structure of directories and files on your local drive in the Tree List control by implementing node dynamic loading in unbound mode.

View Example

csharp
using DevExpress.XtraTreeList.Columns;
using DevExpress.XtraTreeList.Nodes;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TreeList_UnboundMode_ViaBeforeExpandEvent {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            InitTreeList();
            InitData();
        }

        private void InitTreeList() {
            TreeListColumn treeListColumn1 = new TreeListColumn();
            TreeListColumn treeListColumn2 = new TreeListColumn();
            TreeListColumn treeListColumn3 = new TreeListColumn();
            TreeListColumn treeListColumn4 = new TreeListColumn();

            // 
            // treeListColumn1
            // 
            treeListColumn1.Caption = "FullName";
            treeListColumn1.FieldName = "FullName";
            // 
            // treeListColumn2
            // 
            treeListColumn2.Caption = "Name";
            treeListColumn2.FieldName = "Name";
            treeListColumn2.MinWidth = 27;
            treeListColumn2.VisibleIndex = 0;
            treeListColumn2.Width = 274;
            // 
            // treeListColumn3
            // 
            treeListColumn3.Caption = "Type";
            treeListColumn3.FieldName = "Type";
            treeListColumn3.VisibleIndex = 1;
            treeListColumn3.Width = 112;
            // 
            // treeListColumn4
            // 
            treeListColumn4.AppearanceCell.Options.UseTextOptions = true;
            treeListColumn4.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
            treeListColumn4.Caption = "Size(Bytes)";
            treeListColumn4.FieldName = "Size";
            treeListColumn4.Format.FormatType = DevExpress.Utils.FormatType.Numeric;
            treeListColumn4.Format.FormatString = "n0";
            treeListColumn4.VisibleIndex = 2;
            treeListColumn4.Width = 123;

            treeList1.Columns.AddRange(new DevExpress.XtraTreeList.Columns.TreeListColumn[] {
            treeListColumn1,
            treeListColumn2,
            treeListColumn3,
            treeListColumn4});

            treeList1.Dock = System.Windows.Forms.DockStyle.Fill;
            treeList1.OptionsBehavior.AutoChangeParent = false;
            treeList1.OptionsBehavior.AutoNodeHeight = false;
            treeList1.OptionsBehavior.CloseEditorOnLostFocus = false;
            treeList1.OptionsBehavior.Editable = false;
            treeList1.OptionsSelection.KeepSelectedOnClick = false;
            treeList1.OptionsBehavior.ShowToolTips = false;
            treeList1.OptionsBehavior.SmartMouseHover = false;

            treeList1.StateImageList = this.imageList1;

            treeList1.AfterCollapse += new DevExpress.XtraTreeList.NodeEventHandler(this.treeList1_AfterCollapse);
            treeList1.AfterExpand += new DevExpress.XtraTreeList.NodeEventHandler(this.treeList1_AfterExpand);
            treeList1.BeforeExpand += new DevExpress.XtraTreeList.BeforeExpandEventHandler(this.treeList1_BeforeExpand);
        }

        private void InitData() {
            InitFolders(Directory.GetDirectoryRoot(Directory.GetCurrentDirectory()), null);
        }

        private void InitFolders(string path, TreeListNode pNode) {
            treeList1.BeginUnboundLoad();
            TreeListNode node;
            DirectoryInfo di;
            try {
                string[] root = Directory.GetDirectories(path);
                foreach (string s in root) {
                    try {
                        di = new DirectoryInfo(s);
                        node = treeList1.AppendNode(new object[] { s, di.Name, "Folder", null }, pNode);
                        node.StateImageIndex = 0;
                        node.HasChildren = HasFiles(s);
                        if (node.HasChildren)
                            node.Tag = true;
                    }
                    catch { }
                }
            }
            catch { }
            InitFiles(path, pNode);
            treeList1.EndUnboundLoad();
        }

        private void InitFiles(string path, TreeListNode pNode) {
            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 }, pNode);
                    node.StateImageIndex = 1;
                    node.HasChildren = false;
                }
            }
            catch { }
        }

        private bool HasFiles(string path) {
            string[] root = Directory.GetFiles(path);
            if (root.Length > 0) return true;
            root = Directory.GetDirectories(path);
            if (root.Length > 0) return true;
            return false;
        }

        private void treeList1_BeforeExpand(object sender, DevExpress.XtraTreeList.BeforeExpandEventArgs e) {
            if (e.Node.Tag != null) {
                Cursor currentCursor = Cursor.Current;
                Cursor.Current = Cursors.WaitCursor;
                InitFolders(e.Node.GetDisplayText("FullName"), e.Node);
                e.Node.Tag = null;
                Cursor.Current = currentCursor;
            }
        }

        private void treeList1_AfterExpand(object sender, DevExpress.XtraTreeList.NodeEventArgs e) {
            if (e.Node.StateImageIndex != 1) e.Node.StateImageIndex = 2;
        }

        private void treeList1_AfterCollapse(object sender, DevExpress.XtraTreeList.NodeEventArgs e) {
            if (e.Node.StateImageIndex != 1) e.Node.StateImageIndex = 0;
        }
    }

}
vb
Imports DevExpress.XtraTreeList.Columns
Imports DevExpress.XtraTreeList.Nodes
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.IO
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks
Imports System.Windows.Forms

Namespace TreeList_UnboundMode_ViaBeforeExpandEvent
    Partial Public Class Form1
        Inherits Form

        Public Sub New()
            InitializeComponent()
            InitTreeList()
            InitData()
        End Sub

        Private Sub InitTreeList()
            Dim treeListColumn1 As New TreeListColumn()
            Dim treeListColumn2 As New TreeListColumn()
            Dim treeListColumn3 As New TreeListColumn()
            Dim treeListColumn4 As New TreeListColumn()

            ' 
            ' treeListColumn1
            ' 
            treeListColumn1.Caption = "FullName"
            treeListColumn1.FieldName = "FullName"
            ' 
            ' treeListColumn2
            ' 
            treeListColumn2.Caption = "Name"
            treeListColumn2.FieldName = "Name"
            treeListColumn2.MinWidth = 27
            treeListColumn2.VisibleIndex = 0
            treeListColumn2.Width = 274
            ' 
            ' treeListColumn3
            ' 
            treeListColumn3.Caption = "Type"
            treeListColumn3.FieldName = "Type"
            treeListColumn3.VisibleIndex = 1
            treeListColumn3.Width = 112
            ' 
            ' treeListColumn4
            ' 
            treeListColumn4.AppearanceCell.Options.UseTextOptions = True
            treeListColumn4.AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
            treeListColumn4.Caption = "Size(Bytes)"
            treeListColumn4.FieldName = "Size"
            treeListColumn4.Format.FormatType = DevExpress.Utils.FormatType.Numeric
            treeListColumn4.Format.FormatString = "n0"
            treeListColumn4.VisibleIndex = 2
            treeListColumn4.Width = 123

            treeList1.Columns.AddRange(New DevExpress.XtraTreeList.Columns.TreeListColumn() { treeListColumn1, treeListColumn2, treeListColumn3, treeListColumn4})

            treeList1.Dock = System.Windows.Forms.DockStyle.Fill
            treeList1.OptionsBehavior.AutoChangeParent = False
            treeList1.OptionsBehavior.AutoNodeHeight = False
            treeList1.OptionsBehavior.CloseEditorOnLostFocus = False
            treeList1.OptionsBehavior.Editable = False
            treeList1.OptionsSelection.KeepSelectedOnClick = False
            treeList1.OptionsBehavior.ShowToolTips = False
            treeList1.OptionsBehavior.SmartMouseHover = False

            treeList1.StateImageList = Me.imageList1

            AddHandler treeList1.AfterCollapse, AddressOf treeList1_AfterCollapse
            AddHandler treeList1.AfterExpand, AddressOf treeList1_AfterExpand
            AddHandler treeList1.BeforeExpand, AddressOf treeList1_BeforeExpand
        End Sub

        Private Sub InitData()
            InitFolders(Directory.GetDirectoryRoot(Directory.GetCurrentDirectory()), Nothing)
        End Sub

        Private Sub InitFolders(ByVal path As String, ByVal pNode As TreeListNode)
            treeList1.BeginUnboundLoad()
            Dim node As TreeListNode
            Dim di As DirectoryInfo
            Try
                Dim root() As String = Directory.GetDirectories(path)
                For Each s As String In root
                    Try
                        di = New DirectoryInfo(s)
                        node = treeList1.AppendNode(New Object() { s, di.Name, "Folder", Nothing }, pNode)
                        node.StateImageIndex = 0
                        node.HasChildren = HasFiles(s)
                        If node.HasChildren Then
                            node.Tag = True
                        End If
                    Catch
                    End Try
                Next s
            Catch
            End Try
            InitFiles(path, pNode)
            treeList1.EndUnboundLoad()
        End Sub

        Private Sub InitFiles(ByVal path As String, ByVal pNode As TreeListNode)
            Dim node As TreeListNode
            Dim fi As FileInfo
            Try
                Dim root() As String = Directory.GetFiles(path)
                For Each s As String In root
                    fi = New FileInfo(s)
                    node = treeList1.AppendNode(New Object() { s, fi.Name, "File", fi.Length }, pNode)
                    node.StateImageIndex = 1
                    node.HasChildren = False
                Next s
            Catch
            End Try
        End Sub

        Private Function HasFiles(ByVal path As String) As Boolean
            Dim root() As String = Directory.GetFiles(path)
            If root.Length > 0 Then
                Return True
            End If
            root = Directory.GetDirectories(path)
            If root.Length > 0 Then
                Return True
            End If
            Return False
        End Function

        Private Sub treeList1_BeforeExpand(ByVal sender As Object, ByVal e As DevExpress.XtraTreeList.BeforeExpandEventArgs)
            If e.Node.Tag IsNot Nothing Then
                Dim currentCursor As Cursor = Cursor.Current
                Cursor.Current = Cursors.WaitCursor
                InitFolders(e.Node.GetDisplayText("FullName"), e.Node)
                e.Node.Tag = Nothing
                Cursor.Current = currentCursor
            End If
        End Sub

        Private Sub treeList1_AfterExpand(ByVal sender As Object, ByVal e As DevExpress.XtraTreeList.NodeEventArgs)
            If e.Node.StateImageIndex <> 1 Then
                e.Node.StateImageIndex = 2
            End If
        End Sub

        Private Sub treeList1_AfterCollapse(ByVal sender As Object, ByVal e As DevExpress.XtraTreeList.NodeEventArgs)
            If e.Node.StateImageIndex <> 1 Then
                e.Node.StateImageIndex = 0
            End If
        End Sub
    End Class

End Namespace

See Also

Unbound Mode