Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Дерево в памяти. Как его лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Есть таблица в MSSQL вида: Код: plaintext Короче, дерево с узлами, для каждого узла определены аттрибуты и их значения. Есть GUI форма, состоящая из TreeView и полей, которые соответствуют аттрибутам. Надо: Зачитать дерево, отобразить в TreeView, и сделать так, чтобы по выделению узла в полях значения менялись на соответствующие данному узлу. Если в полях изменяются значения аттрибутов и давится кнопка "Save", то внести соответствующие изменения в базу. Что сделал - зачитал дерево, нарисовал его в TreeView, в качестве элементов вписал NodeID. По изменению выделения узла происходит зачитка атрибутов из базы. За ключ берется значение TreeView.SelectedNode.Text. Оно конечно так работает, но имхо, получилась какая-то лабуда - значения хранятся в компоненте, предназначеном для отображения информации. Плюс постоянно происходит обращение к базе. Плюс по-хорошему надо отображать NodeCaption, которые не всегда уникальны. Есть мысль, что надо создать какую-то деревянную структуру в памяти, зачитать сначала в нее, хранить все изменения в памяти, а потом скопом писать их на сервер. Что-то в этом духе: <Дерево в TreeView> - <Дерево в Памяти> - <Дерево на SQL сервере> Проблема - напрочь заклинило как это дело (дерево в памяти) реализовать. Мысли вертятся вокруг написания собственного типа. Но задача-то типовая, значит есть каие-то стандартные метода решения. Идеи есть? Да, еще один момент - хорошо бы дерево не целиком зачитывать, а только по мере надобности кусками. Язык разработки - VB.NET ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2004, 16:58 |
|
||
|
Дерево в памяти. Как его лучше организовать?
|
|||
|---|---|---|---|
|
#18+
>Оно конечно так работает, но имхо, получилась какая-то лабуда - значения хранятся в компоненте, предназначеном для отображения информации. Плюс постоянно происходит обращение к базе. Плюс по-хорошему надо отображать NodeCaption, которые не всегда уникальны. Ну TreeNode можно расширить при помощи tag. Как вариант: Создайте свой класс со своими атрибутами и значениями. И экземпляры этого класса записывайте в Tag. В Tag может храниться любой объект. В нужный момент из Tag извлекайте свой экземпляр класса делайте необходимые измения. В простейшем случае tag очень помогает. >Что сделал - зачитал дерево, нарисовал его в TreeView, в качестве элементов вписал NodeID. По изменению выделения узла происходит зачитка атрибутов из базы. За ключ берется значение TreeView.SelectedNode.Text. Чем зачитали что используете для этого? Быть может использовать DataSet который как раз и подгружать по частям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2004, 08:04 |
|
||
|
Дерево в памяти. Как его лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Точно. На данный момент видение задачи таково: Поскольку деревяшка лежит на сервере в виде таблицы, то вытягивать на клиента части этого датасета - открылся узел, зачитать в датасет данные и отобразить в TreeView. Открылся еще один узел - снова зачитать. В Tag записать ключи ID. Меяется выделенный узел в TreeView - cчитать из Tag-а ID, по нему считать значения аттрибутов из датасета в памяти. И все это отобразить. Осталось только сделать. Если кто знает грабли такого подхода - поделитесь. А то сначала все казалось очень просто, но оказалось - увы, не очень. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2004, 18:30 |
|
||
|
Дерево в памяти. Как его лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Думаю дочитывать по кликам на узлы - не лучшеий вариант. А если пользователь захочет сразу Expand All? Базу задергаете. Считаю что читать нужно сразу. У меня были реализации с бесконечным количеством уровней на VB6 и нормально, зачитывал все в начале, без динамического добавления. А уж .NET-то всяко быстрее будет. Как вариант, хватаем по-быстрому рута с первым уровнем и показываем, а остальных подгружать асинхронно. Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2004, 22:09 |
|
||
|
Дерево в памяти. Как его лучше организовать?
|
|||
|---|---|---|---|
|
#18+
>Думаю дочитывать по кликам на узлы - не лучшеий вариант. А если пользователь захочет сразу Expand All? Базу задергаете. Все Зависит от объема данных, иногда Expand All полезно убирать, а пользователю объяснить что слишком много хотеть вредно :-) ИМХО Асинхронность тоже расмотрел бы как последний вариант 2 SQLRоokiе Если объем данных большой или будет большой в перспективе. То одно из возможных решений: Грузим только первый уровень, плюс к каждому node добавляем фиктивный Node типа - "щелкни сюда если хочешь увидеть данные". Когда пользователель нажимает на этот Node то догружаем данные в DataSet по известному ID из tag. Только все таки наверное в Tag хранить надо не только ID, а всю структуру записи: NodeID, ParentId, NodeCaption, Attribute1 and etc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2004, 11:12 |
|
||
|
Дерево в памяти. Как его лучше организовать?
|
|||
|---|---|---|---|
|
#18+
Всем спасибо. Как делать - действительно зависит от постановки. Постановка была такая - не вытягивать разом все записи (поскольку их могут быть многие миллионы), а подгружать по мере надобности по факту открытия узла. Задача, собственно, взялась из тестового задания, которое я успешно провалил, в силу отсутствия знания класса TreeView вообще и свойства Tag в частности. Сейчас все сделал почти так, как тут выше предлагалось: отдельный класс, хранящий значения аттрибутов, объект этого класса запихивается в Tag. По факту изменения значений аттрибутов узла - сохранение в базе. В принципе была идея хранить все в датасете и обновлять разом несколько измененных узлов, но доделывать, вернее, переделывать стало лениво. Задачка, кстати, мне понравилась - относительно простым заданием проверяется знание много чего - ADO.NET, базовых классов, то, как человек придумывает и реализует алгоритм. На все про все было выделено три часа. Время, кстати, адекватное? Потому как я с этим проковырялся где-то часов семь на выходных с перерывом на обед... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2004, 18:22 |
|
||
|
|

start [/forum/topic.php?fid=20&msg=32541581&tid=1439083]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
68ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 263ms |
| total: | 425ms |

| 0 / 0 |
