一个功能更强大,性能更高的树控件DevComponents.AdvTree.AdvTree(几种树形控件汇总)

发布时间 2023-12-26 11:51:49作者: yinghualeihenmei

原文链接:https://www.cnblogs.com/a7373773/archive/2009/07/27/1532236.html

一直在用DevComponents.DotNetBar2  控件
近来探索Add()和AddRange()的性能问题。
一样用极为不专业不科学的方法,
比较DevComponents.AdvTree.AdvTree 的Add()和AddRange()的性能


 1private void buttonX1_Click(object sender, EventArgs e)
 2        {
 3            TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
 4
 5            advTree1.Nodes.Clear();
 6
 7            for (int i = 0; i < integerInput1.Value; i++)
 8            {
 9                Node node = new Node();
10                node.Text = "这是第:" + i.ToString() + "节点";
11
12                advTree1.Nodes.Add(node);
13            }
14
15            TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
16
17            TimeSpan ts = ts1.Subtract(ts2).Duration();
18
19            lbltiem1.Text = ts.Minutes.ToString() + "分钟" +
20                ts.Seconds.ToString() + "秒" +
21                ts.Milliseconds + "毫秒";
22        }
23
24        private void buttonX2_Click(object sender, EventArgs e)
25        {
26            TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
27
28            advTree1.Nodes.Clear();
29
30            Node[] nodes = new Node[integerInput1.Value];
31
32            for (int i = 0; i < integerInput1.Value; i++)
33            {
34                Node node = new Node();
35                node.Text = "这是第:" + i.ToString() + "节点";
36
37                nodes[i] = node;
38            }
39
40            advTree1.Nodes.AddRange(nodes);
41
42            TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
43
44            TimeSpan ts = ts1.Subtract(ts2).Duration();
45
46            lbltiem2.Text = ts.Minutes.ToString() + "分钟" +
47                ts.Seconds.ToString() + "秒" +
48                ts.Milliseconds + "毫秒";
49        }
50
51        private void buttonX3_Click(object sender, EventArgs e)
52        {
53            TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
54
55            advTree1.Nodes.Clear();
56
57            TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
58
59            TimeSpan ts = ts1.Subtract(ts2).Duration();
60
61            lbltiem3.Text = ts.Minutes.ToString() + "分钟" +
62                ts.Seconds.ToString() + "秒" +
63                ts.Milliseconds + "毫秒";
64        }
65
66        private void buttonX4_Click(object sender, EventArgs e)
67        {
68            TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks);
69
70            for (int i = advTree1.Nodes.Count - 1; i >= 0; i--)
71            {
72                advTree1.Nodes.RemoveAt(i);
73            }
74
75            TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
76
77            TimeSpan ts = ts1.Subtract(ts2).Duration();
78
79            lbltime4.Text = ts.Minutes.ToString() + "分钟" +
80                ts.Seconds.ToString() + "秒" +
81                ts.Milliseconds + "毫秒";
82        }

分别测试1000个节点,5000个节点,10000个节点。

 

 

 

 


上面所取的花费时间 都是多次测试后,取最快的时间。
结果比较:

 性能比较


.net自带的树控件ListBox 性能比较


比较后,DevComponents.AdvTree.AdvTree 的Add()和AddRange()的性能
要比TreeView和ListBox  都要高出很多。

但是DevComponents.AdvTree.AdvTree  有个很耗时的地方。
就是单个移除节点。Nodes.RemoveAt()和Nodes.Remove();

Nodes.Clear()是清除所有节点。速度很快。
但是单个的Remove()节点,速度却相当慢。。

 

.net自带的树控件TreeView

原文链接:https://blog.csdn.net/wenchm/article/details/133276828

https://blog.csdn.net/xiaogongzhu001/article/details/131100371

        TreeView控件(树控件)可以为用户显示节点层次结构,每个节点又可以包含子节点,包含子节点的节点叫父节点。就像在Windows操作系统的Windows资源管理器功能的左窗口中显示文件和文件夹一样。

1、在窗体上放置 TreeView 控件:
在 Visual Studio 的窗体设计器中,从工具箱中拖动并放置一个 TreeView 控件到你的窗体上。

2、添加树节点:

使用 TreeView 控件的 Nodes 属性来添加和管理树节点。
使用 TreeView.Nodes.Add 方法添加根节点。
使用 TreeNode.Nodes.Add 方法添加子节点。
使用 TreeNode.Text 属性设置节点显示的文本。
3、处理 TreeView 的事件:

AfterSelect:当选择了一个节点后触发的事件。你可以通过订阅该事件,在节点选择变化时执行特定的操作。
4、修改节点样式:

使用 TreeNode.ForeColor 属性设置节点文本的前景色。
使用 TreeNode.BackColor 属性设置节点背景色。
使用 TreeNode.NodeFont 属性设置节点文本的字体样式。

一、添加和删除树节点 
1.添加节点
        使用TreeView控件Nodes属性的Add()方法,可以向控件中添加节点。

public virtual int Add(TreeNode node)
☑ node:要添加到集合中的TreeNode。
☑ 返回值:添加到树节点集合中的TreeNode的从零开始的索引值。
2.移除节点
        使用TreeView控件Nodes属性的Remove()方法可以从树节点集合中移除指定的树节点。

public void Remove (TreeNode node)
node:要移除的TreeNode。
二、获取树控件中选中的节点
        可以在控件的AfterSelect事件中,使用EventArgs对象返回对已单击节点对象的引用。通过检查TreeViewEventArgs类(它包含与事件有关的数据),确定单击了哪个节点。

        在BeforeCheck(在选中树节点复选框前发生)或AfterCheck(在选中树节点复选框后发生)事件中尽可能不要使用TreeNode.Checked属性。

1.源码

//Form1.cs
//AfterSelect事件使用EventArgs对象返回对已单击节点对象的引用
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 _11
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
//初始化Form1
label1.Visible = false;

//创建父节点
TreeNode treeNode = treeView1.Nodes.Add("银行");

//创建子节点
TreeNode treeNode_1 = new TreeNode("徽商银行");
TreeNode treeNode_2 = new TreeNode("华夏银行");
TreeNode treeNode_3 = new TreeNode("浙商银行");

//给父节点添加子节点
treeNode.Nodes.Add(treeNode_1);
treeNode.Nodes.Add(treeNode_2);
treeNode.Nodes.Add(treeNode_3);
}

//AfterSelect事件使用EventArgs对象返回对已单击节点对象的引用
private void TreeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
label1.Visible = true;
label1.Text = "选中的节点是:" + e.Node.Text;
}
}
}

2.生成效果
 

 

 

三、为树控件中的节点设置图标
        TreeView控件可在每个节点旁显示图标。图标紧挨着节点文本的左侧。若要显示这些图标,必须使树视图与ImageList控件相关联。

        设置TreeView控件的ImageList属性为想要使用的现有ImageList控件。这些属性可在设计器中使用“属性”窗口进行手动设置,也可在代码中编程设置。

treeView1.ImageList = imageList1;
        设置节点的ImageIndex和SelectedImageIndex属性,ImageIndex属性确定正常和展开状态下的节点显示的图像,SelectedImageIndex属性确定选定状态下的节点显示的图像。

1.源码
//Form1.cs
//为树控件中的节点设置图标
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 _12
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
treeView1.Dock = DockStyle.Fill;

//创建父节点
TreeNode treeNode = treeView1.Nodes.Add("组织结构");

//创建子节点
TreeNode treeNode_1 = new TreeNode("C#部门");
TreeNode treeNode_2 = new TreeNode("C++部门");
TreeNode treeNode_3 = new TreeNode("VB部门");

//给父节点添加子节点
treeNode.Nodes.Add(treeNode_1);
treeNode.Nodes.Add(treeNode_2);
treeNode.Nodes.Add(treeNode_3);

//给imagelist1添加图片
imageList1.Images.Add(Image.FromFile("1.png"));
imageList1.Images.Add(Image.FromFile("2.png"));

//treeView1和imageList1建立关联
treeView1.ImageList = imageList1;
imageList1.ImageSize = new Size(16, 16);

//默认显示图标ID=0,鼠标选中时显示图标ID=1
treeView1.ImageIndex = 0;
treeView1.SelectedImageIndex = 1;
}
}
}

2.生成效果