работа с TreeView
От: Viktor Sklyar Украина  
Дата: 18.05.04 11:58
Оценка:
Хотелось бы послушать Ваше мнение по

Сначала, что мы имеем:


class User
{
    public string Name;
    public int Status;
    public ArrayList Groups;
}

class Group
{
    public string Name;
    public ArrayList Users;
}



User'ы могут быть в нескольких группах или сами по себе.

Это все добро надо отображать в виде дерева:


Group1
---User1
---User2
Group
---User1
---User3
Group
---User2
---User4
User5
User6

User'ы в дереве должны быть отсортированы по Status'у, а при их равенстве по Name
Если Status становится равным 0 — в дереве его не отображать.
А если в Group'е статус всех User'ов равен 0, то и группу не отображать.

Такие вот условия. Вроде все просто.

а теперь проблемы:

Сортировать TreeView не умеет. Поэтому перед тем как заполнять TreeView
я сортирую пользователей в группе.
Вывожу. Все вроде хорошо. Но, ведь пользователи время от времени меняют
свой статус и я должен перерисовывать дерево.

Для этого я должен заново отсортировать пользователей в группах.
И ...

Построить новое дерево? (я сейчас так делаю)
Или что-то проделать над существующим?

Конечно я могу не пересоздавать дерево, но
проблема в том, что получив статус = 0 пользоваетль пропадает из списка.
И соответсвенно пустая группа должна пропасть, а появившись заново, я должен
добавить и пользователя и группу в дерево заново...

Если бы TreeNode имело свойство Visible — то решить проблему можно было, но
такого же нет...

Сейчас, перестраивая дерево я получаю такие проблемы:
— при перерисовки список довольно неприятно дергается, хотя
все операции с деревом я произвожу в блоке

treeView1.BeginUpdate();
...
treeView1.EndUpdate();


и еще, если дерево было проскроллированно до какой-то определенной
позиции, т.е. TopNode != первому узлу, то построим дерево заново
я естесственно попадаю опять в начало дерева. Это мне вообще не
нравится. Можно конечно запоминать его и в новом дереве начинать
отображение с него, но как это сделать?

Плюс к предыдущему, я вынужден был в класс Group добавить свойство
bool IsExpand, которое используется при построении нового дерева,
что бы общий вид TreeView оставался таким как было и до этого.

Каждый TreeNode.Tag я приравниваю ссылкой на объект User или Group.
Но я постоянно пересоздаю дерево. Не расходуется ли безконтрольно
память из-за использования ссылок? Корректно ли просто убить узлы
дерева

treeVie1.Nodes.Clear();


чтобы освободить(может и в недалеком будущем) все объекты на которые
ссылаются Tag'и?

Вот такие вот дела.
Как бы все это сделать лучше?
Хочется чтобы все было по-человечески...


Буду благодарен любой помощи.
Спасибо за внимание.
С Уважением.
Re: работа с TreeView
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.05.04 20:44
Оценка:
Здравствуйте, Viktor Sklyar, Вы писали:

Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: работа с TreeView
От: Viktor Sklyar Украина  
Дата: 19.05.04 09:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш.


откуда? (не бейте за глупый вопрос, но где это...)
С Уважением.
Re[2]: работа с TreeView
От: Viktor Sklyar Украина  
Дата: 20.05.04 09:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Viktor Sklyar, Вы писали:


VD>Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш.


Закачал я с CVS весь проект Janus.
Там нашел папку TreeGrid2.

Вопрос 1: Для RSDN.WinForms.sln используется что-то вне этой папки?

Вопрос 2: Могу ли я откомпилировать проект с помощью VS7 предварительно переконвертировав проекты из VS7.1?

Вопрос 3: Могу ли я взять готовые dll (какие?) из установленного Janus и установить компонент (как?), чтобы использовать его в своем проекте?

Спасибо.
... << RSDN@Home 1.1.3 stable >>
С Уважением.
Re[3]: работа с TreeView
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.05.04 15:57
Оценка:
Здравствуйте, Viktor Sklyar, Вы писали:

VS>Закачал я с CVS весь проект Janus.

VS>Там нашел папку TreeGrid2.

VS>Вопрос 1: Для RSDN.WinForms.sln используется что-то вне этой папки?


Нет. Все в ней.

VS>Вопрос 2: Могу ли я откомпилировать проект с помощью VS7 предварительно переконвертировав проекты из VS7.1?


Не советую. Перекомпирировать то можно. Но там есть поект на МС++. А МС++ в 7.0 был дико глючный.

VS>Вопрос 3: Могу ли я взять готовые dll (какие?) из установленного Janus и установить компонент (как?), чтобы использовать его в своем проекте?


Скопировать в каталог своего приложения (отладлочный и релизный) и подключить референс на TreeGrid2.dll. Только опять же он скомпилирован под 7.1 и тянет за собой сборки от 7.1 (точнее от фрэймворка 1.1).

VS>Спасибо.


Незачто.
... << RSDN@Home 1.1.3 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: работа с TreeView
От: NortiBoy  
Дата: 23.05.04 20:34
Оценка:
Здравствуйте, Viktor Sklyar, Вы писали:

VS>Сейчас, перестраивая дерево я получаю такие проблемы:

VS>- при перерисовки список довольно неприятно дергается, хотя
VS>все операции с деревом я произвожу в блоке

Создай свой TreeView пронаследовавшись.
Добавь проперти IsMyRefresh.

Перед изменением дерева, до BeginUpdate задай IsMyRefresh = true;
После изменения дерева, до EndUpdate задай IsMyRefresh = false;

Зачем IsMyRefresh ?
Вот для этого ( в твоём TreeView ):

private int WM_ERASEBKGND = 0x0014;
protected override void WndProc( ref Message m )
{
if ( ( m.Msg == WM_ERASEBKGND )&& OurRefresh )
{
return;
}
else
{
base.WndProc( ref m );
}
}


VS>и еще, если дерево было проскроллированно до какой-то определенной

VS>позиции, т.е. TopNode != первому узлу, то построим дерево заново
VS>я естесственно попадаю опять в начало дерева. Это мне вообще не
VS>нравится. Можно конечно запоминать его и в новом дереве начинать
VS>отображение с него, но как это сделать?

Перед обновлением дерева запомни текущую выбранную ноду. После обновления дерева
сделай CurrentNode.EnsureVisible();
В случае если этой ноды уже нет (удалена), то сделай то же самое с Parent.

Удачи
Re[2]: работа с TreeView
От: Viktor Sklyar Украина  
Дата: 24.05.04 08:45
Оценка:
Здравствуйте, NortiBoy, Вы писали:

Спасибо за советы.
У меня несколько уточняющих вопросов:

NB>После изменения дерева, до EndUpdate задай IsMyRefresh = false;


тут точно ДО(?) EndUpdate?...


...
    if ( ( m.Msg == WM_ERASEBKGND )&& OurRefresh )
...


тут случайно вместо OurRefresh не IsMyRefresh?
С Уважением.
Re[2]: работа с TreeView
От: Аноним  
Дата: 18.10.04 06:45
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Viktor Sklyar, Вы писали:


VD>Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш.


А этот тригрид можно юзать в коммерческих аппликациях ? Или только опенсорц ?
Re[3]: работа с TreeView
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.10.04 12:51
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А этот тригрид можно юзать в коммерческих аппликациях ?


Можно.

А> Или только опенсорц ?


Одно другого не исключает. Опен сорс != ГНУ.

Просто его самого или его модифицированные исходники ты продавать не имешь права. А продавать подукт который включает его — сколько влезет.
... << RSDN@Home 1.1.4 beta 3 rev. 204>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: работа с TreeView
От: lozzy  
Дата: 18.10.04 13:45
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, <Аноним>, Вы писали:


А>>А этот тригрид можно юзать в коммерческих аппликациях ?


VD>Можно.


А>> Или только опенсорц ?


VD>Одно другого не исключает. Опен сорс != ГНУ.


VD>Просто его самого или его модифицированные исходники ты продавать не имешь права. А продавать подукт который включает его — сколько влезет.


Thanks ! Попробую заюзать, а то стандартный TreeView и поделки с codeproject-a как-то не тянут совсем
Re[5]: работа с TreeView
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.10.04 14:26
Оценка:
Здравствуйте, lozzy, Вы писали:

L>Thanks ! Попробую заюзать, а то стандартный TreeView и поделки с codeproject-a как-то не тянут совсем


Пробуй. Если что обращайся...

Кстит, если испоьзуешь второй фрэймворк, то лучше брать портированную версию выделенную в отдельный проект. Если что могу подкинуть ЮРЛ.
... << RSDN@Home 1.1.4 beta 3 rev. 204>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: работа с TreeView
От: lozzy  
Дата: 19.10.04 13:38
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, lozzy, Вы писали:


L>>Thanks ! Попробую заюзать, а то стандартный TreeView и поделки с codeproject-a как-то не тянут совсем


VD>Пробуй. Если что обращайся...


VD>Кстит, если испоьзуешь второй фрэймворк, то лучше брать портированную версию выделенную в отдельный проект. Если что могу подкинуть ЮРЛ.


Хехе А ее сложно будет портировать на ФВ 1.1 ?
Re[7]: работа с TreeView
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.10.04 22:13
Оценка:
Здравствуйте, lozzy, Вы писали:

L>Хехе А ее сложно будет портировать на ФВ 1.1 ?


Сложновато. Я там выкинул С++-ный контрол и использую виртуальный режим появившийся в фрэймворкном ListView.

Собвственно TreeGrid — это реализация модели дерева на базе виртуального грида. Если найти качесвенный халявный виртуальный грид (с поддержкой виртуального режима), то можно будет использовать его. А так писать гору кода как-то не охота.
... << RSDN@Home 1.1.4 beta 3 rev. 206>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: работа с TreeView
От: Nikolay_P_I  
Дата: 27.10.04 08:31
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш


А чего он ругается "Field not found" на совйство Nodes (не найден некий _Root) и что, собственно значит "работа с внешней коллекцией" (Свойства DataSource не нашел)
Re[3]: работа с TreeView
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.10.04 10:14
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>А чего он ругается "Field not found" на совйство Nodes (не найден некий _Root)


А где код берешь?

N_P> и что, собственно значит "работа с внешней коллекцией" (Свойства DataSource не нашел)


Есть интерфейс ITreeNode. Реализуешь его в своем классе и он автоматом будет показываеться в TreeGrid.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: работа с TreeView
От: Nikolay_P_I  
Дата: 28.10.04 15:19
Оценка:
Здравствуйте, VladD2, Вы писали:

N_P>>А чего он ругается "Field not found" на совйство Nodes (не найден некий _Root)


VD>А где код берешь?


За неимением CVSа — свежий snapshoot.rar найденный через менюшки этого сайта.

N_P>> и что, собственно значит "работа с внешней коллекцией" (Свойства DataSource не нашел)


VD>Есть интерфейс ITreeNode. Реализуешь его в своем классе и он автоматом будет показываеться в TreeGrid.


А дерево придется самому строить или можно будет ArrayList дать с какими ID, ParentID ?
Re[5]: работа с TreeView
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.10.04 19:37
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>За неимением CVSа — свежий snapshoot.rar найденный через менюшки этого сайта.


Из снэпшота я буквально неделю назад компилировалось. Было все ОК. Проверь скомпилировал ли ты С++-ный проект.

N_P>А дерево придется самому строить или можно будет ArrayList дать с какими ID, ParentID ?


ArrayList не предназначен для хранения иерархических структур. Его можно использовать в качестве внутреннего хнанилища. Вообще, пример в Хоуме.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: работа с TreeView
От: Nikolay_P_I  
Дата: 29.10.04 13:02
Оценка:
Здравствуйте, VladD2, Вы писали:

N_P>>За неимением CVSа — свежий snapshoot.rar найденный через менюшки этого сайта.

VD>Из снэпшота я буквально неделю назад компилировалось. Было все ОК. Проверь скомпилировал ли ты С++-ный проект.

На всякий случай перекомпилировал все по-одиночке. Заработало!

N_P>>А дерево придется самому строить или можно будет ArrayList дать с какими ID, ParentID ?

VD>ArrayList не предназначен для хранения иерархических структур. Его можно использовать в качестве внутреннего хнанилища. Вообще, пример в Хоуме

Может я не тот пример смотрел, но в тестовой Form1 есть структура, поддерживающая ITreeNode, но это ведь, кажется, дерево, сделанное руками ?

А мне нужен вариант дерева с возможностью линейного доступа по
collection[index], collection[key], collection.Remove(object).

Или, наоборот, TreeGrid, умеющий показывать дерево из списка с Parent-ID.

Жаль что TreeGrid2 не то, что мне хотелось. (Но зато я его к другим местами прикручу )
Re[7]: работа с TreeView
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.10.04 13:32
Оценка:
Здравствуйте, Nikolay_P_I, Вы писали:

N_P>А мне нужен вариант дерева с возможностью линейного доступа по

N_P>collection[index], collection[key], collection.Remove(object).

Дык коллекцию организуешь ты сам. Как захочешь так и сделаешь. В этом весь и смысл. Тебе просто нужно реализовать в своей коллекции интерфейс ITreeNode и пожно будет отображать ее в TreeGrid.

N_P>Или, наоборот, TreeGrid, умеющий показывать дерево из списка с Parent-ID.


Ну, а как должне нвыглядеть этот самый список?

N_P> Жаль что TreeGrid2 не то, что мне хотелось. (Но зато я его к другим местами прикручу )


Я так и не понял, что тебе нужно.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: работа с TreeView
От: Nikolay_P_I  
Дата: 29.10.04 14:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Дык коллекцию организуешь ты сам. Как захочешь так и сделаешь. В этом весь и смысл. Тебе просто нужно реализовать в своей коллекции интерфейс ITreeNode и пожно будет отображать ее в TreeGrid.


VD>Я так и не понял, что тебе нужно.


Дерево, имеющее доступ к любому объекту по ID, возможность получить ID по объекту, возможность удалить объект по ID.

Грубо говоря — синтез HashTable и TreeView.

Нет, ручками оно, конечно, можно все организовать — но я так прикинул и получится, что почти все взаимосвязи самому придется и писать.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.