Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с TreeView 
:(
    Опции темы
Corey
Дата 19.7.2011, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



Здравствуйте.
Подскажите, пожалуйста! 
Имеется дерево, нужно, чтобы при выставлении флага в дочернем узле автоматически выделялись все его родительские узлы. И здесь проблема, у меня реализовано, чтобы при выделении флагом родительского узла, автоматически выделялись и дочернии. Т.е. происходит как бы обратная реакция.
Как это можно разрешить?
PM MAIL   Вверх
Суровый
Дата 19.7.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.4.2009

Репутация: 1
Всего: 2



Corey
Самое простое решение - не форсированно выставлять флаги, а сделать проверку выставлены ли они или нет. Если не выставлены - выставить, а если выставлены - ничего не делать, что прекратит запуск обработчиков.
PM MAIL   Вверх
Corey
Дата 19.7.2011, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



Спасибо за ответ.
Но если, допустим, флаги не выставлены и выставляются в соответствии с алгоритмом выставления флагов на родительских узлах. То здесь как раз и срабатывает опять событие AfterCheck с выставленем флагов дочерних, которых совсем не нужно помечать.
PM MAIL   Вверх
Суровый
Дата 19.7.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.4.2009

Репутация: 1
Всего: 2



Corey
Вы не совсем поняли)
Проверку нужно сделать в обоих обработчиках.
PM MAIL   Вверх
Corey
Дата 19.7.2011, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



Но как тогда поставить условие, что выставление флага идет родительского узла (чтоб не помечать его потомков), а не текущего (в этом случае помечаются флагами дочерние). Отписка от событий не помогает, точнее, отписаться получается для пометки родительского, но возобновить подписку не удается
PM MAIL   Вверх
Суровый
Дата 20.7.2011, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 30.4.2009

Репутация: 1
Всего: 2



Возможно не очень красивое решение, но больше ничего в голову не лезет.
Обрабатываем событие "клик по ноде"
Код

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (wasChanged)
            {
                if (e.Node.Checked)
                {
                    foreach (TreeNode node in e.Node.Nodes)
                        checkChilds(node);
                    checkParents(e.Node);
                }
            }
            wasChanged = false;
        }

Переменная wasChanged показывает, привел ли клик по ноде к изменению состояния чекбокса.
Это выполняется следующим кодом:
Код

        private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
        {
            wasChanged = true;
        }

Функции checkChilds и checkParents работают рекурсивно:
Код

        private void checkChilds(TreeNode parent)
        {
            parent.Checked = true;
            foreach (TreeNode node in parent.Nodes)
                checkChilds(node);
        }

        private void checkParents(TreeNode node)
        {
            if (node.Parent != null)
            {
                node.Parent.Checked = true;
                checkParents(node.Parent);
            }
        }


Вот такие пироги. Прошу сильно не бить  smile 
PM MAIL   Вверх
Corey
Дата 23.7.2011, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



Спасибо большое за помощь smile Все замечательно работает! Проставляет и пэренты, но вместе с ними отмечает и все остальные низ лежащие узлы  smile 
PM MAIL   Вверх
Corey
Дата 26.7.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 19.7.2011

Репутация: нет
Всего: нет



Да, все получилось, еще раз спасибо!

Это сообщение отредактировал(а) Corey - 26.7.2011, 15:33
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.