Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

(VS2008 / C#) Multi-State TreeView Control

38K
29 марта 2010 года
EqKeeper
94 / / 19.02.2010
Доброго времени суток!

Позарез понадобилось древо, в котором чекбоксы имеют не два состояния (помечен / не помечен), а произвольное их количество. А вместо галочек - буковки, плюсики, минусики, квадратики и т.д.

Сразу же бросился гуглить - нашел примеров пять Tri-State, где третим состоянием чекбокса был квадратик (часть наследников помечена).

Вот некоторые из них:
http://www.codeproject.com/KB/tree/TriStateTreeViewSubmissio.aspx
http://www.codeproject.com/KB/tree/ThreeStateTreeview.aspx
http://www.codeguru.com/cpp/controls/treeview/misc-advanced/article.php/c3983

Все бы хорошо, но вот проблемы:
1) Уж не знаю - проблема ли в "новой" студии или они и впрямь не работоспособные, но глючат все поголовно. Один наиболее, как мне показалось, перспективный, я попытался разобрать, переписав под свои нужды, но что до, что после, работать он отказался - отметки ставились не поочереди, а совершенно хаотично. Бросил. Взял другой - при запуске программы он выкинул виндовую ошибку, хотя в конструкторе выглядел весьма привлекательно... И так со всеми...
2) Все они заточены под 3 состояния, как буд-то на них свет клином сошелся!
3) Все они написаны... грязно. Изобилует совершенно лишними, неудобными в работе деталями...

В результате, я сижу без компонента, но с большим желанием его заполучить... :)

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

Конечный продукт в моем понимании должен выглядеть примерно так:
Стандартный TreeView, у которого есть свойство, содержащее либо ссылку на ImageList с кастомными чекбоксами, либо встроенный ImageList (если это возможно). А свойство Checked для TreeNode являлось бы не bool'ом, а int'ом. Ну а картинки из ImageList, соответственно, выбирались бы в соответствии со значением этого самого int Checked. Вот и все! И я не понимаю - действительно ли это так сложно реализовать, и зачем для этого нужно городить все то, что городили авторы вышеозначенных компонент...

В идеале (опять же, если это возможно), писать не новый класс, аля CustomTreeView и, соответственно, для него CustomTreeNode и прочие прелести-наследники, которые только путают и увеличивают объем кода, а изменить стандартный класс - двустатовые чекбоксы мне точно никогда и нигде не понадобятся, а если понадобятся - ничто не мешает вставить в ImageList всего 2 картинки - Unchecked, Checked. А, если свойства можно перегрузить(bool/int, по ситуации), то непосвященный и вовсе ничего не заметит... Воть.

Очень надеюсь на вашу помощь - уже два проекта из-за этого встало. =\\
P.S. Наверное, несколько сумбурно... Но, надеюсь, что мысли свои мне донести удалось... Если нет - перепишу более структурировано. :)
297
31 марта 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: EqKeeper

но что до, что после, работать он отказался - отметки ставились не поочереди, а совершенно хаотично.
2) Все они заточены под 3 состояния, как буд-то на них свет клином сошелся!
3) Все они написаны... грязно. Изобилует совершенно лишними, неудобными в работе деталями...


EqKeeper, вероятно вы не поняли, для чего используются три состояния чекбокса. Когда у ВСЕХ детишек узла чекбокс находится в состоянии Checked, этот родительский узел тоже помечается Checked. Когда у ВСЕХ детишек узла чекбокс находится в состоянии Unchecked, этот родительский узел тоже помечается Unchecked. Третье состояние выставляется, когда лишь часть дочерних узлов выбрана. Соответственно, дополнительный код предназначен для реализации этого функционала.

Поясните, для чего вам нужно много состояний? И в зависимости от чего они должны меняться?

Навскидку могу предложить хранить состояние в свойстве Tag узла (если оно не используется для других нужд). А нужную картинку рисовать поверх чекбокса вручную. Чтобы чекбокс полностью не мешался, можно задать для него прозрачные картинки для обоих состояний.

307
31 марта 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: EqKeeper
Доброго времени суток!

Позарез понадобилось древо, в котором чекбоксы имеют не два состояния (помечен / не помечен), а произвольное их количество. А вместо галочек - буковки, плюсики, минусики, квадратики и т.д. ...



отнаследуйтесь и напишите свой компонент, будет проще.

38K
31 марта 2010 года
EqKeeper
94 / / 19.02.2010
Цитата: koodeer
EqKeeper, вероятно вы не поняли, для чего используются три состояния чекбокса. Когда у ВСЕХ детишек узла чекбокс находится в состоянии Checked, этот родительский узел тоже помечается Checked. Когда у ВСЕХ детишек узла чекбокс находится в состоянии Unchecked, этот родительский узел тоже помечается Unchecked. Третье состояние выставляется, когда лишь часть дочерних узлов выбрана. Соответственно, дополнительный код предназначен для реализации этого функционала.

Поясните, для чего вам нужно много состояний? И в зависимости от чего они должны меняться?

Навскидку могу предложить хранить состояние в свойстве Tag узла (если оно не используется для других нужд). А нужную картинку рисовать поверх чекбокса вручную. Чтобы чекбокс полностью не мешался, можно задать для него прозрачные картинки для обоих состояний.


Да нет, все как раз-таки понял. Вот только мне нужно именно несколько чекбоксов. В древе - чтобы расставлять +, - и unchecked. Плюс - включить. Минус - исключить. unchecked - наследовать. Но это пока. В будущем понадобится больше состояний. А в отдельном checkbox'е уже нужно - 9 чекбоксов с 5 различными состояниями это намного удобнее, и компактнее, чем 9 групп по 5 radiobutton'ов. :)
Что же касается рисования поверх и использования тегов - это как раз то, что я назвал "грязно".

Artem_3A
Да, я уже понял, что придется сделать именно это. Быть может, поможете? Я просто не знаю с чего начать... Мне ведь нужно отследить - в каких методах и как используется свойство checked, потом переписать их, заменив нужные кусочки кода своими. А собственно как узнать - что и как происходит в нутрях TreeView? Где-то можно посмотреть его исходники? Или осваивать метапрограммирование на C#? >_>

307
01 апреля 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: EqKeeper

Artem_3A
Да, я уже понял, что придется сделать именно это. Быть может, поможете? Я просто не знаю с чего начать... Мне ведь нужно отследить - в каких методах и как используется свойство checked, потом переписать их, заменив нужные кусочки кода своими. А собственно как узнать - что и как происходит в нутрях TreeView? Где-то можно посмотреть его исходники? Или осваивать метапрограммирование на C#? >_>



Качай и читай книжку товарища Павла Агурова "C# Разработка компонентов в MS VISUAL STUDIO 2005/2008", там все описано гораздо подробней, понятней и правильней нежели я тут тебе буду объяснять. Вдруг еще ошибусь в чем, вообще беда будет, а сие возможно, бо я как бы на c# компонентов не писал, вот на с++ для Qt, это да! :D

38K
01 апреля 2010 года
EqKeeper
94 / / 19.02.2010
Цитата: Artem_3A
Качай и читай книжку товарища Павла Агурова "C# Разработка компонентов в MS VISUAL STUDIO 2005/2008", там все описано гораздо подробней, понятней и правильней нежели я тут тебе буду объяснять. Вдруг еще ошибусь в чем, вообще беда будет, а сие возможно, бо я как бы на c# компонентов не писал, вот на с++ для Qt, это да! :D


Ага! Значит, когда я перейду на Qt, я буду знать кого терзать глупыми вопросами! :D

Спасибо, пошел качать.

38K
01 апреля 2010 года
EqKeeper
94 / / 19.02.2010
Кхм... это зовется подставой... >_>
Скачал, почитал, ушел спать с больной головой и плохим настроением.
Как минимум, там нет ничего по моему вопросу:
Цитата:
Да, я уже понял, что придется сделать именно это. Быть может, поможете? Я просто не знаю с чего начать... Мне ведь нужно отследить - в каких методах и как используется свойство checked, потом переписать их, заменив нужные кусочки кода своими. А собственно как узнать - что и как происходит в нутрях TreeView? Где-то можно посмотреть его исходники? Или осваивать метапрограммирование на C#? >_>


В книге 80% материала посвящена дизайну компонентов, а остальное - написанию новых компонентов. Да и написано странно - и без того понятные вещи разжеваны, при этом в море "страшных" терминов вполне можно утонуть.

В общем, вопрос остается открытым... Помогите, кто-нибудь...:(

307
02 апреля 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: EqKeeper
Кхм... это зовется подставой... >_>
Скачал, почитал, ушел спать с больной головой и плохим настроением.
Как минимум, там нет ничего по моему вопросу: ...



А что вы ожидали, что там будет глава как написать ваш компонент? Там даются основы и пример разработки своего компонента, дальше уже дело за вами! MSDN вам в помощь и вперед, смотрите пример, возникают конкретные вопросы ищите на MSDN, к тому же там можно найти статьи по написанию компонентов и примеры, вот только на буржуйском. Но предупреждаю заранее статьи как написать ваш компонент там скорее всего нет! ;)

ЗЫ: да и к тому же в выше указанной книге описывается, все что вам надо, во первых, дополнительная отрисовка компонентов, то есть как намуливать квадратики, минусики и прочие, во вторых базовый класс компонент, где указывается какие интерфейсы должны быть реализованы(подробней о них гуглите или мздн), и описано как работать с событиями в компоненте. Более вам как бы и не требуется!=\ реализовать надо в следующем порядке, сначала реализуете чек бокс с несколькими состояниями и отрисовкой, потом реализуете дерево как контейнер для чекбоксов. все, компонент готов. и да прибудет с вами сила!

38K
02 апреля 2010 года
EqKeeper
94 / / 19.02.2010
Цитата: Artem_3A
А что вы ожидали, что там будет глава как написать ваш компонент? Там даются основы и пример разработки своего компонента, дальше уже дело за вами! MSDN вам в помощь и вперед, смотрите пример, возникают конкретные вопросы ищите на MSDN, к тому же там можно найти статьи по написанию компонентов и примеры, вот только на буржуйском. Но предупреждаю заранее статьи как написать ваш компонент там скорее всего нет! ;)

ЗЫ: да и к тому же в выше указанной книге описывается, все что вам надо, во первых, дополнительная отрисовка компонентов, то есть как намуливать квадратики, минусики и прочие, во вторых базовый класс компонент, где указывается какие интерфейсы должны быть реализованы(подробней о них гуглите или мздн), и описано как работать с событиями в компоненте. Более вам как бы и не требуется!=\ реализовать надо в следующем порядке, сначала реализуете чек бокс с несколькими состояниями и отрисовкой, потом реализуете дерево как контейнер для чекбоксов. все, компонент готов. и да прибудет с вами сила!



Поскольку, это мой первый компонент, то хотелось бы как раз инструкции по его реализации, о чем писалось выше.
Что же касается всего остального - да не нужно мне это. Я же не создаю новый компонент, я наследую уже готовый, полностью функционирующий TreeView, в котором все необходимые методы реализованы и их нужно только немного подправить. И вопрос сейчас стоит именно так: как узнать алгоритм работы того или иного метода, события, класса, чтобы восстановить по нему исходный код или где этот исходный код можно найти. Все остальное я почерпну из вышеозначенных примеров.;)

307
02 апреля 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: EqKeeper
И вопрос сейчас стоит именно так: как узнать алгоритм работы того или иного метода, события, класса, чтобы восстановить по нему исходный код или где этот исходный код можно найти. Все остальное я почерпну из вышеозначенных примеров.;)



вопрос аналогичен вопросу "а откуда скачать исходники винды?". если ты не в курсе, то как бы платформа дот нет как и форточка есть детище билли и компании мелкомягких, то есть коды закрыты и хранятся в форте нокс за тремя замками, даже разработчики проекта моно работают по методу вероятностного программирования, то бишь без стандарта и на угад. вывод, бери и пиши свой компонент руководствуясь здравым смыслом и описанием в MSDN компонента дерева.

341
02 апреля 2010 года
Der Meister
874 / / 21.12.2007
Цитата: Artem_3A
вопрос аналогичен вопросу "а откуда скачать исходники винды?". если ты не в курсе, то как бы платформа дот нет как и форточка есть детище билли и компании мелкомягких, то есть коды закрыты и хранятся в форте нокс за тремя замками, даже разработчики проекта моно работают по методу вероятностного программирования, то бишь без стандарта и на угад. вывод, бери и пиши свой компонент руководствуясь здравым смыслом и описанием в MSDN компонента дерева.


Microsoft .NET Source - не-е?

307
02 апреля 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: Der Meister



во блин!0_о я умер и в раю туксов??? :eek:

а когда такое дело образовалось, я отстал от жизни на пару десятков лет? или это все же сон?

хотя пошарив не много... по моему все же не то... позже скачаю посмотрю подробней.

297
02 апреля 2010 года
koodeer
1.2K / / 02.05.2009
Цитата: EqKeeper
А собственно как узнать - что и как происходит в нутрях TreeView? Где-то можно посмотреть его исходники?


http://www.koders.com/csharp/fidB6AC18C659085347BED11C11D98B179E126D79DF.aspx

38K
02 апреля 2010 года
EqKeeper
94 / / 19.02.2010
koodeer
Огромнейшее спасибо!

Der Meister
Большое спасибо.

Artem_3A
Ну вот, и мне хорошо, и тебе польза! ^_^

---
Ушел ковырять. Я счастлив! ^___^
5
03 апреля 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: EqKeeper
Где-то можно посмотреть его исходники?


.NET Reflector - инструмент для декомпиляции .NET сборок, бесплатный.

38K
03 апреля 2010 года
EqKeeper
94 / / 19.02.2010
Спасибище!:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог