gpt4 book ai didi

c# - 如何以最快的方式在 TreeView 中添加节点?

转载 作者:太空狗 更新时间:2023-10-29 20:05:37 25 4
gpt4 key购买 nike

美好的一天!

我想就此事提出您的建议。

我正在办公室制作一个小工具,用于将“产品层次结构数据”显示为树状 View 。我们的应用程序只能以表格方式显示它,因此很难跟踪层次结构中是否存在任何不正确的数据。

我能够制定一些逻辑并在正确的层次结构中显示数据。

但我的主要问题是我要处理 100K-200K+ 条记录,创建/分配每个节点并将其添加到树中肯定需要时间。从我的测试来看,平均每分钟可以创建的节点是 8000 个。我还注意到这个应用程序的内存使用量随着它的运行而逐渐增加。

我将包含数据结构的屏幕截图以及应用程序的外观,以便您了解一些信息:

enter image description here

enter image description here

请考虑下面我的代码,我很高兴知道您对如何优化它的想法。我知道这里有很多需要改进的地方。

抱歉发了这么长的帖子...

顺便说一下,我使用的是 C# 和 .net2.0。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Data.OleDb;
using System.Data;
using System.IO;
using System.Threading;

namespace WinformAppTest
{
public partial class MainForm : Form
{
private DataSet _ds = new DataSet();

public MainForm()
{
InitializeComponent();
}

void MainFormLoad(object sender, EventArgs e)
{
PopulateDataSet();

lblTotalRows.Text = _ds.Tables[0].Rows.Count.ToString();
}

void PopulateDataSet()
{
string query = @"select * from " + "test.csv";
try
{
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\;Extended Properties=\"Text;HDR=Yes;FMT=Delimited\"");
OleDbDataAdapter da = new OleDbDataAdapter();

OleDbCommand cmd = new OleDbCommand(query, conn);
conn.Open();
da.SelectCommand = cmd;
_ds.Clear();
da.Fill(_ds, "CSV");

conn.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.GetBaseException().ToString());
}
}

void BtnRunClick(object sender, EventArgs e)
{
Thread newThread1 = new Thread(MainForm.DoWork);
newThread1.Start(this);
}

public static void DoWork(object data)
{
MainForm form = (MainForm)data;
int counter = 0;
TreeNode[] nd;

foreach(DataRow row in ((MainForm)data)._ds.Tables[0].Rows)
{
TreeNode node = new TreeNode();
if(row["Level Number"].ToString() == "1")
{
node.Name = row["ECC Hierarchy Code"].ToString();
node.Text = row["ECC Hierarchy Code"].ToString() + ", " + row["Name"].ToString();

form.Invoke((MethodInvoker)delegate { ((MainForm)data).treeView1.Nodes.Add(node); });
}
else
{
nd = ((MainForm)data).treeView1.Nodes.Find(row["Parent Code"].ToString(), true);
node.Name = (string)row["ECC Hierarchy Code"];
node.Text = row["ECC Hierarchy Code"].ToString() + ", " + row["Name"].ToString();

form.Invoke((MethodInvoker)delegate { nd[0].Nodes.Add(node); });
}

counter++;
form.Invoke((MethodInvoker)delegate { ((MainForm)data).lblLoded.Text = counter.ToString(); });
}
}
}
}

最佳答案

这其中的关键可能在于:

  1. 调用 TreeView.BeginUpdate
  2. 向 TreeView 添加/删除多个节点
  3. 调用 TreeView.EndUpdate

这会停止在添加/删除节点时发生的任何绘制。一旦调用 EndUpdate,整个 TreeView 只被绘制一次。

http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.beginupdate.aspx

关于c# - 如何以最快的方式在 TreeView 中添加节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10844237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com