работа с 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'и?

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


Буду благодарен любой помощи.
Спасибо за внимание.
С Уважением.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.