Создание объектов, управляемых базой данных для заполнения Treeview - очень медленно
У меня есть приложение, которое читает таблицу из базы данных.
Я выдаю SQL-запрос, чтобы получить набор результатов, основываясь на уникальном строковом значении, которое я получаю из результатов, и использую оператор case/switch для генерации определенных объектов (они наследуют TreeNode BTW). Эти созданные объекты шунтируются в объект Dictionary, который будет использоваться позже.
При создании этих объектов я использую некоторые значения из результирующего набора, чтобы заполнить значения в объекте через установщики.
Я запрашиваю словарь, чтобы вернуть определенный тип объекта и использую его для заполнения древовидного представления. Однако невозможно заполнить 2 объекта одного и того же типа в древовидной структуре из объекта Dictionary (вы получаете ошибку времени выполнения - которая в настоящий момент ускользает от меня, что-то вроде ссылки на один и тот же объект). Поэтому мне нужно использовать memberwiseClone и реализовать IClonable, чтобы обойти это.
Я делаю это правильно? Есть ли лучший способ - потому что я думаю, что это заставляет мою программу быть очень медленной в этот момент. По крайней мере, я думаю, что это немного неуклюже - любые советы от людей, которые знают больше, чем я - очень ценятся.
3 ответа
Чтобы добавить в @ Брэд, заполняйте дерево только по мере необходимости. Это означает подключение к событию расширения узлов дерева. Это похоже на то, как работает Windows Explorer при работе с сетевыми ресурсами.
Там должно быть 1 TreeNode
объект на фактический узел дерева в дереве - не пытайтесь повторно использовать вещи. Вы можете связать их со своими данными, используя свойство Tag (это рекомендуемый метод), или вы можете создать подкласс TreeNode
сам (это метод Java, но используется меньше в.NET).
(Использование методов клонирования обычно является намеком на то, что вы либо (а) делаете что-то не так, либо (б) нужно разложить модель предметной области, чтобы отделить изменяемые объекты от неизменяемых.)
Есть ли причина, по которой вы используете внешний словарь? Я бы заполнил дерево напрямую при запросе данных.
Если вам требуется словарь, вы можете установить свойство.Tag узла дерева, чтобы оно указывало на данные в вашем словаре.
Рассматривали ли вы использование представления виртуального дерева, которое загружает только те узлы, на которые пользователь действительно хочет посмотреть - у меня был хороший успех с компонентом с www.infralution.com