Создание объектов, управляемых базой данных, для заполнения Treeview – очень медленно

StackOverflow https://stackoverflow.com/questions/56224

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top