![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как быстро заполнить TreeView по данным ClientDataset
gedevan © (2016-02-27 06:59:00)В ClientDataSet таблица структуры Parent,Name,Index
ну и соответственно в эту таблицу забито дерево. В этом дереве присутствует корневой элемент, который имеет всегда одинаковое имя. И вот я заполнял TreeView создавая в нем сначала этот корневой элемент, а потом делая фильтр по датасету по этому имени. И получал список ему подчиненных узлов и т.д.
ClientDataSet1.Filtered := false;
ClientDataSet1.filter := 'Parent = ''' + ParentNode + '''';
ClientDataSet1.Filtered := true;
И в итоге мы пришли к тому, что 500 элементов заполняются 8 секунд, что как бы меня не устроило. Также я выяснил, что самое медленное место это как раз вот этот код.
Тогда я решил пойти другим путем, отсортировав по полю Index дата сет и просто прямым циклом делал по нему перебор. А в дереве искал среди добавленных уже узлов родителя очередного элемента и прицеплял к нему новый. Я надеялся, что родительские элементы добавляются в таблицу раньше чем подчиненные и поэтому если идти по порядку по полю Index, то не получится так, что прицеплять элемент не к чему, т.к. родитель в дерево еще не добавлен. Зря я на это надеялся. Особенно потому что в процессе работы, подчиненный элемент могут перепривязать к другому родителю. Хотя этим методом заполнение 500 записей заняло 1 секунду. Но несколько записей просто никуда не привязались...
Что же делать..
Единственное, что мне приходит в голову, это перенумеровать поле Index как то. А как его перенумеровать в голову мне не приходит.
gedevan (2016-02-27 08:03:00) [1]ClientDataSet1 локальный, ни к чему не подключенный.