powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Дерево в памяти. Как его лучше организовать?
6 сообщений из 6, страница 1 из 1
Дерево в памяти. Как его лучше организовать?
    #32537226
SQLRоokiе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица в MSSQL вида:

Код: plaintext
NodeID, ParentID, NodeCaption, Attribute1, ... , AttributeN

Короче, дерево с узлами, для каждого узла определены аттрибуты и их значения. Есть GUI форма, состоящая из TreeView и полей, которые соответствуют аттрибутам.

Надо: Зачитать дерево, отобразить в TreeView, и сделать так, чтобы по выделению узла в полях значения менялись на соответствующие данному узлу. Если в полях изменяются значения аттрибутов и давится кнопка "Save", то внести соответствующие изменения в базу.

Что сделал - зачитал дерево, нарисовал его в TreeView, в качестве элементов вписал NodeID. По изменению выделения узла происходит зачитка атрибутов из базы. За ключ берется значение TreeView.SelectedNode.Text.

Оно конечно так работает, но имхо, получилась какая-то лабуда - значения хранятся в компоненте, предназначеном для отображения информации. Плюс постоянно происходит обращение к базе. Плюс по-хорошему надо отображать NodeCaption, которые не всегда уникальны.

Есть мысль, что надо создать какую-то деревянную структуру в памяти, зачитать сначала в нее, хранить все изменения в памяти, а потом скопом писать их на сервер. Что-то в этом духе:

<Дерево в TreeView> - <Дерево в Памяти> - <Дерево на SQL сервере>

Проблема - напрочь заклинило как это дело (дерево в памяти) реализовать. Мысли вертятся вокруг написания собственного типа. Но задача-то типовая, значит есть каие-то стандартные метода решения.

Идеи есть?

Да, еще один момент - хорошо бы дерево не целиком зачитывать, а только по мере надобности кусками.
Язык разработки - VB.NET
...
Рейтинг: 0 / 0
Дерево в памяти. Как его лучше организовать?
    #32537876
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Оно конечно так работает, но имхо, получилась какая-то лабуда - значения хранятся в компоненте, предназначеном для отображения информации. Плюс постоянно происходит обращение к базе. Плюс по-хорошему надо отображать NodeCaption, которые не всегда уникальны.

Ну TreeNode можно расширить при помощи tag.

Как вариант:
Создайте свой класс со своими атрибутами и значениями. И экземпляры этого класса записывайте в Tag. В Tag может храниться любой объект.
В нужный момент из Tag извлекайте свой экземпляр класса делайте необходимые измения.

В простейшем случае tag очень помогает.

>Что сделал - зачитал дерево, нарисовал его в TreeView, в качестве элементов вписал NodeID. По изменению выделения узла происходит зачитка атрибутов из базы. За ключ берется значение TreeView.SelectedNode.Text.

Чем зачитали что используете для этого? Быть может использовать DataSet который как раз и подгружать по частям.
...
Рейтинг: 0 / 0
Дерево в памяти. Как его лучше организовать?
    #32539489
SQLRоokiе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точно. На данный момент видение задачи таково:

Поскольку деревяшка лежит на сервере в виде таблицы, то вытягивать на клиента части этого датасета - открылся узел, зачитать в датасет данные и отобразить в TreeView. Открылся еще один узел - снова зачитать.

В Tag записать ключи ID. Меяется выделенный узел в TreeView - cчитать из Tag-а ID, по нему считать значения аттрибутов из датасета в памяти. И все это отобразить.

Осталось только сделать.

Если кто знает грабли такого подхода - поделитесь. А то сначала все казалось очень просто, но оказалось - увы, не очень.
...
Рейтинг: 0 / 0
Дерево в памяти. Как его лучше организовать?
    #32539667
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю дочитывать по кликам на узлы - не лучшеий вариант.
А если пользователь захочет сразу Expand All?
Базу задергаете.
Считаю что читать нужно сразу. У меня были реализации с бесконечным количеством уровней на VB6 и нормально, зачитывал все в начале, без динамического добавления. А уж .NET-то всяко быстрее будет.

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


Magnus
...
Рейтинг: 0 / 0
Дерево в памяти. Как его лучше организовать?
    #32539759
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Думаю дочитывать по кликам на узлы - не лучшеий вариант.
А если пользователь захочет сразу Expand All?
Базу задергаете.

Все Зависит от объема данных, иногда Expand All полезно убирать, а пользователю объяснить что слишком много хотеть вредно :-)

ИМХО Асинхронность тоже расмотрел бы как последний вариант

2 SQLRоokiе

Если объем данных большой или будет большой в перспективе.
То одно из возможных решений:

Грузим только первый уровень, плюс к каждому node добавляем фиктивный Node типа - "щелкни сюда если хочешь увидеть данные". Когда пользователель нажимает на этот Node то догружаем данные в DataSet по известному ID из tag.

Только все таки наверное в Tag хранить надо не только ID, а всю структуру записи: NodeID, ParentId, NodeCaption, Attribute1 and etc.
...
Рейтинг: 0 / 0
Дерево в памяти. Как его лучше организовать?
    #32541581
SQLRоokiе
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо. Как делать - действительно зависит от постановки.

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

Задача, собственно, взялась из тестового задания, которое я успешно провалил, в силу отсутствия знания класса TreeView вообще и свойства Tag в частности. Сейчас все сделал почти так, как тут выше предлагалось: отдельный класс, хранящий значения аттрибутов, объект этого класса запихивается в Tag. По факту изменения значений аттрибутов узла - сохранение в базе.

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


Задачка, кстати, мне понравилась - относительно простым заданием проверяется знание много чего - ADO.NET, базовых классов, то, как человек придумывает и реализует алгоритм. На все про все было выделено три часа. Время, кстати, адекватное? Потому как я с этим проковырялся где-то часов семь на выходных с перерывом на обед...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Дерево в памяти. Как его лучше организовать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]