Хотелось бы послушать Ваше мнение по
Сначала, что мы имеем:
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'и?
Вот такие вот дела.
Как бы все это сделать лучше?
Хочется чтобы все было по-человечески...
Буду благодарен любой помощи.
Спасибо за внимание.