Заполнение TreeGridVew с помощью потоков - PullRequest
0 голосов
/ 23 сентября 2019

Марк Ридоут (бывший программист 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, чтобы я мог затем добавить это дерево узлов к представлению после выполнения потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...