2008-09-11 9 views
2

У меня есть приложение, которое читает таблицу из базы данных.Создание объектов, управляемых базой данных для заполнения Treeview - очень медленно

Я выдаю SQL-запрос для получения набора результатов на основе уникального строкового значения, которое я получаю из результатов, я использую оператор case/switch для генерации определенных объектов (они наследуют TreeNode BTW). Эти создаваемые объекты обходятся в объект Dictionary, который будет использоваться позже.

При создании этих объектов я использую некоторые значения из набора результатов для заполнения значений в объекте через сеттеры.

Я запрашиваю словарь, чтобы возвращать определенный тип объекта и использовать его для заполнения древовидной структуры. Однако невозможно заполнить 2 объекта одного типа в древовидной структуре из объекта Dictionary (вы получаете ошибку времени выполнения, которая ускользает от меня в данный момент, что-то со ссылкой на тот же объект). Поэтому мне нужно использовать memberwiseClone и реализовать IClonable, чтобы обойти это.

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

ответ

1

Чтобы добавить к @Brad, только заполнить дерево по мере необходимости. Это означает подключение к событию расширения узлов дерева. Это похоже на то, как работает проводник Windows при работе с сетевыми ресурсами.

Должно быть 1 TreeNode объект на фактический узел дерева в дереве - не пытайтесь повторно использовать вещи. Вы можете связать их с вашими данными, используя свойство Tag (это рекомендуемый метод), или вы можете подклассифицировать сам TreeNode (это метод Java, но меньше используется в .NET).

(использование методов клонирования, как правило, намек, что вы либо (а) делать что-то неправильно, или (б) необходимо учитывать модель домена, чтобы отделить изменяемые объекты от неизменны.)

2

Есть ли причина, по которой вы используете внешний словарь? Я бы заполнил дерево непосредственно по мере запроса данных.

Если вам действительно нужен словарь, вы можете установить свойство .Tag узла дерева, чтобы указать на данные в словаре.

0

у вас рассмотренный с использованием представления Virtual Tree, которое загружает только узлы, на которые пользователь действительно хочет посмотреть - у меня был хороший успех с компонентом от www.infralution.com