DevExpress控件虚拟树VirtualTreeListData使用

关于“DevExpress.XtraTreeList.v10.2” 的树控件treelist和虚拟树IVirtualTreeListData运行速度的比较:

首先编写继承虚拟树接口IVirtualTreeListData的类,MyData如下:

 

namespace test_virtualTreeListAsZMX
{
    //我的数据
    public class MyData:TreeList.IVirtualTreeListData
    {
        protected MyData parentCore;
        protected ArrayList chrildrenCore = new ArrayList();
        protected object[] cellsCore;
        public MyData(MyData parentCoreIn,object[] cellsCoreIn)
        {
            parentCore = parentCoreIn;
            cellsCore = cellsCoreIn;
            if (this.parentCore != null)
            {
                this.parentCore.chrildrenCore.Add(this);
            }
        }

        public void VirtualTreeGetCellValue(VirtualTreeGetCellValueInfo info)
        {
            info.CellData = this.cellsCore[info.Column.AbsoluteIndex];
        }
        public void VirtualTreeGetChildNodes(VirtualTreeGetChildNodesInfo info)
        {
            info.Children = this.chrildrenCore;
        }
        public void VirtualTreeSetCellValue(VirtualTreeSetCellValueInfo info)
        {
            cellsCore[info.Column.AbsoluteIndex] = info.NewCellData;
        }
    }
}

 

其次编写main函数:

namespace test_virtualTreeListAsZMX
{
    public partial class Form1 : Form
    {
        Stopwatch sw = new Stopwatch();
        private int intMax=0;
        public Form1()
        {
            InitializeComponent();
            Initdata();
        }
        private void Initdata()
        {
            int maxNum=1000000;
            MyData dataResource = new MyData(null,null);
            MyData root1 = new MyData(dataResource,new string[] {"root1","high"});
            MyData a1 = new MyData(root1,new string[] {"a1","middle"});
            MyData a2=new MyData(a1,new string[] {"a2","low"});
            MyData root2 = new MyData(dataResource, new string[] { "root2", "high" });
            //MyData mydataTest = treelistData(root2);
            TreeListColumn c1 = new TreeListColumn();
            c1.Caption = "name";
            c1.VisibleIndex = 0;
            TreeListColumn c2 = new TreeListColumn();
            c2.Caption = "value";
            c2.VisibleIndex = 1;
            this.treeList1.Columns.AddRange(new  TreeListColumn[] {c1,c2});
            this.treeList1.DataSource=dataResource;

            //测试
            //ordinaryTreeList
            sw.Start();
            TreeListColumn c5 = new TreeListColumn();
            c5.Caption = "name";
            c5.VisibleIndex = 0;
            TreeListColumn c6 = new TreeListColumn();
            c6.Caption = "value";
            c6.VisibleIndex = 1;
            this.ordinaryTreeList.Columns.AddRange(new TreeListColumn[] { c5, c6 });
            TreeListNode root = this.ordinaryTreeList.AppendNode(new string[] { "a1", "low" }, 0);
            root.Expanded = true;
            for (int jj = 0; jj < maxNum; jj++)
            {
                TreeListNode tln2 = ordinaryTreeList.AppendNode(new string[] { "a2", "low" }, root);
            }
            ordinaryTreeList.ExpandAll();
            sw.Stop();
            Console.WriteLine("ordinaryTreeList_open:" + sw.ElapsedMilliseconds);


            //virtualTreeList
            sw.Start();
            TreeListColumn c3 = new TreeListColumn();
            c3.Caption = "name";
            c3.VisibleIndex = 0;
            TreeListColumn c4 = new TreeListColumn();
            c4.Caption = "value";
            c4.VisibleIndex = 1;
            this.virtualTreeList.Columns.AddRange(new TreeListColumn[] { c3, c4 });
            MyData dataResource1 = new MyData(null, null);
            a2 = new MyData(dataResource1, new string[] { "a1", "low" });
            for (int ii = 0; ii < maxNum; ii++)
            {
                MyData a3 = new MyData(a2, new string[] { "a2", "low" });
            }
            this.virtualTreeList.DataSource = dataResource1;
            virtualTreeList.ExpandAll();
            sw.Stop();
            Console.WriteLine("virtualTreeList_open:" + sw.ElapsedMilliseconds);
        }
        private MyData treelistData(MyData myDataIn)
        {
            intMax++;
            MyData imydata1 = new MyData(myDataIn, new string[] { "a2", "low" });
            MyData imydata2=null;
            if (intMax < 10)
            {
                imydata2 = treelistData(imydata1);
                return imydata2;
            }
            else
                return imydata1;
        }
        [STAThread]
        static void Main(string[] args)
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }
    }
}


运行结果如下:

当节点数为100时,差别不大:

普通树完全展开花费:243 millisecond。

虚拟树完全展开花费:256 millisecond。

 

 

节点数达到1000000个后,差别明显:

普通树完全展开花费:3106 millisecond。

虚拟树完全展开花费:7067 millisecond。

 

截图如下:

DevExpress控件虚拟树VirtualTreeListData使用_第1张图片

 

DevExpress控件虚拟树VirtualTreeListData使用_第2张图片

 

由此可见,虚拟树的好处还有待探索,希望能在其他方面发现它运行速度上的优势。

你可能感兴趣的:(DevExpress,虚拟树)