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 — то решить проблему можно было, но
такого же нет...
Сейчас, перестраивая дерево я получаю такие проблемы:
— при перерисовки список довольно неприятно дергается, хотя
все операции с деревом я произвожу в блоке
и еще, если дерево было проскроллированно до какой-то определенной
позиции, т.е. TopNode != первому узлу, то построим дерево заново
я естесственно попадаю опять в начало дерева. Это мне вообще не
нравится. Можно конечно запоминать его и в новом дереве начинать
отображение с него, но как это сделать?
Плюс к предыдущему, я вынужден был в класс Group добавить свойство
bool IsExpand, которое используется при построении нового дерева,
что бы общий вид TreeView оставался таким как было и до этого.
Каждый TreeNode.Tag я приравниваю ссылкой на объект User или Group.
Но я постоянно пересоздаю дерево. Не расходуется ли безконтрольно
память из-за использования ссылок? Корректно ли просто убить узлы
дерева
treeVie1.Nodes.Clear();
чтобы освободить(может и в недалеком будущем) все объекты на которые
ссылаются Tag'и?
Вот такие вот дела.
Как бы все это сделать лучше?
Хочется чтобы все было по-человечески...
Буду благодарен любой помощи.
Спасибо за внимание.
Здравствуйте, VladD2, Вы писали:
VD>Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш.
откуда? (не бейте за глупый вопрос, но где это...)
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Viktor Sklyar, Вы писали:
VD>Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш.
Закачал я с CVS весь проект Janus.
Там нашел папку TreeGrid2.
Вопрос 1: Для RSDN.WinForms.sln используется что-то вне этой папки?
Вопрос 2: Могу ли я откомпилировать проект с помощью VS7 предварительно переконвертировав проекты из VS7.1?
Вопрос 3: Могу ли я взять готовые dll (какие?) из установленного Janus и установить компонент (как?), чтобы использовать его в своем проекте?
Здравствуйте, 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 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, 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.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Viktor Sklyar, Вы писали:
VD>Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш.
А этот тригрид можно юзать в коммерческих аппликациях ? Или только опенсорц ?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, <Аноним>, Вы писали:
А>>А этот тригрид можно юзать в коммерческих аппликациях ?
VD>Можно.
А>> Или только опенсорц ?
VD>Одно другого не исключает. Опен сорс != ГНУ.
VD>Просто его самого или его модифицированные исходники ты продавать не имешь права. А продавать подукт который включает его — сколько влезет.
Thanks ! Попробую заюзать, а то стандартный TreeView и поделки с codeproject-a как-то не тянут совсем
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, lozzy, Вы писали:
L>>Thanks ! Попробую заюзать, а то стандартный TreeView и поделки с codeproject-a как-то не тянут совсем
VD>Пробуй. Если что обращайся...
VD>Кстит, если испоьзуешь второй фрэймворк, то лучше брать портированную версию выделенную в отдельный проект. Если что могу подкинуть ЮРЛ.
Здравствуйте, lozzy, Вы писали:
L>Хехе А ее сложно будет портировать на ФВ 1.1 ?
Сложновато. Я там выкинул С++-ный контрол и использую виртуальный режим появившийся в фрэймворкном ListView.
Собвственно TreeGrid — это реализация модели дерева на базе виртуального грида. Если найти качесвенный халявный виртуальный грид (с поддержкой виртуального режима), то можно будет использовать его. А так писать гору кода как-то не охота.
... << RSDN@Home 1.1.4 beta 3 rev. 206>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Не мучайся бери TreeGrid из Хоума. Он поддерживает режим работы с внешней коллекцией. Так что будешь править коллекцию и вызывать рефреш
А чего он ругается "Field not found" на совйство Nodes (не найден некий _Root) и что, собственно значит "работа с внешней коллекцией" (Свойства DataSource не нашел)
Здравствуйте, VladD2, Вы писали:
N_P>>А чего он ругается "Field not found" на совйство Nodes (не найден некий _Root)
VD>А где код берешь?
За неимением CVSа — свежий snapshoot.rar найденный через менюшки этого сайта.
N_P>> и что, собственно значит "работа с внешней коллекцией" (Свойства DataSource не нашел)
VD>Есть интерфейс ITreeNode. Реализуешь его в своем классе и он автоматом будет показываеться в TreeGrid.
А дерево придется самому строить или можно будет ArrayList дать с какими ID, ParentID ?
Здравствуйте, Nikolay_P_I, Вы писали:
N_P>За неимением CVSа — свежий snapshoot.rar найденный через менюшки этого сайта.
Из снэпшота я буквально неделю назад компилировалось. Было все ОК. Проверь скомпилировал ли ты С++-ный проект.
N_P>А дерево придется самому строить или можно будет ArrayList дать с какими ID, ParentID ?
ArrayList не предназначен для хранения иерархических структур. Его можно использовать в качестве внутреннего хнанилища. Вообще, пример в Хоуме.
... << RSDN@Home 1.1.4 beta 3 rev. 207>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, 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 не то, что мне хотелось. (Но зато я его к другим местами прикручу )
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Дык коллекцию организуешь ты сам. Как захочешь так и сделаешь. В этом весь и смысл. Тебе просто нужно реализовать в своей коллекции интерфейс ITreeNode и пожно будет отображать ее в TreeGrid.
VD>Я так и не понял, что тебе нужно.
Дерево, имеющее доступ к любому объекту по ID, возможность получить ID по объекту, возможность удалить объект по ID.
Грубо говоря — синтез HashTable и TreeView.
Нет, ручками оно, конечно, можно все организовать — но я так прикинул и получится, что почти все взаимосвязи самому придется и писать.