Скопируйте весь DevExpress.XtraTreeList.TreeList в C # - PullRequest
0 голосов
/ 24 февраля 2012

Сценарий:

Я создаю и заполняю Treelist с использованием базы данных.

Это довольно трудоемкая задача, и я не хочу вешать графический интерфейс (и не имеюлюбой «прогресс-бар» и т. д.).

Поэтому я решил перенести все это на Фонового работника, но так как я не могу обновить дерево из другого потока, то тот, кто его создал, я создаю временное дерево вфоновый поток, а когда закончите, просто скопируйте все содержимое в дерево с графическим интерфейсом.

  1. Каков наилучший способ обойти и скопировать все узлы, данные узлов и т. д.?
  2. Есть ли другой (лучший?) Способ сделать это, то есть построить / создать дерево в Backgroundworker и показать его в графическом интерфейсе?

Редактировать: Мне известно о «взломе»заполнение компонента GUI в фоновом потоке, но поскольку я только что был добавлен в этот проект и попросил «остановить зависание графического интерфейса довольно часто» с очень ограниченным периодом времени, перезапись загрузки и создания данных не являетсядействительно вариант (даже йхотя это было бы наилучшей практикой).Я просто изменил функцию «CreateTree» для запуска в новом потоке, передал вновь созданное дерево в «ThreadComplete» и скопировал его.

Cheers

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Элементы пользовательского интерфейса, такие как TreeView, должны оставаться в конце пользовательского интерфейса. Для этого есть технические причины - Windows не позволяет обновлять элементы пользовательского интерфейса из каких-либо потоков, кроме основных потоков пользовательского интерфейса, но также и по архитектурным причинам: ваш внутренний код доступа к БД не должен быть тесно связан с какой-либо конкретной реализацией пользовательского интерфейса. Если вы решите переключиться с TreeList на другой элемент управления DevExpress или любого другого поставщика, вам придется заменить код по всей вашей системе.

То, что вы хотите сделать, - это чтобы ваш внутренний код создал более общую структуру данных, например список бизнес-объектов с иерархической структурой, например:

public class MyBusinessObject
{
    public string Name {get;set;}
    public List<MyBusinessObject> ChildObjects {get;}
}

и верните список MyBusinessObject из вашей фоновой ветки. Этот список должен быть связан с вашим TreeList с помощью привязки данных. Вы не указали, какую платформу пользовательского интерфейса вы используете - XtraaTreeList - это элемент управления WinForms, верно? - но во всех распространенных инфраструктурах есть опции привязки данных для привязки этого списка бизнес-объектов к элементу управления пользовательского интерфейса, а не для того, чтобы вы делали всю работу самостоятельно.

0 голосов
/ 24 февраля 2012

Чтобы обновить компонент из другого потока, вы можете использовать SynchronizationContext , а затем пройти его, как если бы он находился в том же потоке.

...