Марк Ридоут (бывший программист Microsoft, который разработал элемент управления DataGridView) опубликовал замечательную статью, в которой в 2006 году была объединена DataGridView с элементами управления TreeView. Это очень полезный элемент управления, но имеющий некоторые очень большие недостатки, такие как скорость и масштабируемость.Некоторые из них были рассмотрены пользователями в комментариях к исходному сообщению в блоге (https://blogs.msdn.microsoft.com/markrideout/2006/01/08/customizing-the-datagridview-to-support-expandingcollapsing-ala-treegridview/). Но все равно ОЧЕНЬ медленно, когда загружаются тысячи строк с уровнями глубины до 10 глубины.
Я прочиталнесколько статей, которые описывают, как заполнить записи типа 500 КБ в TreeView менее чем за секунду, используя потоки, но они имеют глубину только 1 уровень, и основная проблема, с которой я сталкиваюсь, - это код:
Классы.TreeGridNode Root = new Classes.TreeGridNode (); Root.Nodes.Add ("test");
TreeGridNode не поддерживает ячейки без подключения к TreeGridView. Метод Add () пытается вызвать node.Cells[0] .Value = value и получает пустое исключение, потому что Cells имеет значение null. TreeView не имеет этой проблемы.
Есть ли способ использовать потоки для заполнения большого количества TreeGridNodes в TreeGridView?В оригинальном блоге Mark Rideout комментарии отключены, и, похоже, нигде в Интернете эта поддержка не поддерживается.будь полезным, спасибо!
Я пытался создать временный TreeGridView для присоединения узлов, но я сталкиваюсь с потоками, переплетающимися друг с другом, которые пока не могу полностью обернуть мой мозг.
private void ButtonGenTree_Click(object sender, EventArgs eArgs)
{
_fillWorker.DoWork += new DoWorkEventHandler((o, e) =>
{
Stopwatch _stopWatch = new Stopwatch();
//TreeNode Root = new TreeNode();
// need to tie the treegridnode to a GRID otherwise the treegridnodecollection won't create a Cells() object for the node!
Classes.TreeGridNode Root = new Classes.TreeGridNode();
MessageBox.Show("root=" + Root.ToString());
//Custom filling goes here instead of this simple for.
for (int i = 0; i < 500000; i++)
{
MessageBox.Show("Loop i=" + i);
Root.Nodes.Add(i.ToString());
}
_stopWatch.Stop();
//Return our root node which contains all the TreeNodes and the elapsed time.
e.Result = new object[2] { Root, _stopWatch.Elapsed.TotalMilliseconds };
});
_fillWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler((o, e) =>
{
Console.WriteLine("Operation took {0} milliseconds.", (e.Result as object[])[1]);
this.treeView1.BeginUpdate();
this.treeView1.Nodes.Add(((e.Result as object[])[0] as TreeNode));
this.treeView1.EndUpdate();
});
_fillWorker.RunWorkerAsync();
}
Хотелось бы добавить узлы в TreeGridNode независимо от TreeGridView, чтобы я мог затем добавить это дерево узлов к представлению после выполнения потоков.