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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перебрать все дочерние контролы формы, Form.Controls 
:(
    Опции темы
DragonFire
Дата 23.2.2009, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

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



Form.Controls содержит список только контролов формы (что очевидно).
А как в цикле перебрать абсолютно все контролы? 

Если поконкретнее - хочу перебрать все TextBox на форме, а они могут быть во вложенных групбоксах, панелях и т.д... 


--------------------
PM MAIL ICQ   Вверх
nagg
Дата 23.2.2009, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот, кто то постил тут уже расширяющий метод:

Код

        public static IEnumerable<Control> FindControls<T>(this Control parent, Predicate<T> condition)
            where T : Control
        {
            foreach (Control child in parent.Controls)
            {
                T controlToCheck = child as T;
                if (controlToCheck != null && (condition == null || condition(controlToCheck)))
                {
                    yield return controlToCheck;
                }

                foreach (Control deepChild in child.FindControls<T>(condition))
                {
                    yield return deepChild;
                }
            }
        }


--------------------
I am the State...
PM MAIL WWW ICQ Skype   Вверх
unicuum
  Дата 23.2.2009, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(nagg @  23.2.2009,  08:46 Найти цитируемый пост)
Вот, кто то постил тут уже расширяющий метод:

 smile Мир сошёл сума.

Код

private void Form1_Load(object sender, System.EventArgs e)
{
    ClassifiedControls(this.Controls);
}

private void ClassifiedControls(Control.ControlCollection controls)
{
    foreach(Control control in controls)
    {
        if (control is TextBox)
            MyTextboxOperation((TextBox)control);
        else
            ClassifiedControls(control.Controls);
    }
}
        
void MyTextboxOperation(TextBox textBox)
{
    textBox.Text = "Вуаля!";
}





--------------------
user posted image
обычный день на винграде
PM   Вверх
PashaPash
Дата 23.2.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



Цитата(unicuum @  23.2.2009,  09:18 Найти цитируемый пост)
smile Мир сошёл сума.

В каком смысле? Обленились не не изобретают велосипед каждый раз?
Цитата(unicuum @  23.2.2009,  09:18 Найти цитируемый пост)
        if (control is TextBox)
            MyTextboxOperation((TextBox)control);

злобный даблкаст.


--------------------
PM MAIL WWW   Вверх
nagg
Дата 23.2.2009, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Конкретно к TextBox, вышеуказаный расширяющий метод можно применить так:

Код

var textBoxCollection = this.FindControls<TextBox>(c => c.Text.Length > 0); // условие для примера


вот собсно все TextBox'ы в которых что-то написано (пример)
--------------------
I am the State...
PM MAIL WWW ICQ Skype   Вверх
unicuum
  Дата 23.2.2009, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(PashaPash @  23.2.2009,  10:16 Найти цитируемый пост)
В каком смысле? Обленились не не изобретают велосипед каждый раз?

Если тебе нужно передавать разные операции, то можешь делать это делегатом или интерфейсом через аргумент метода. Генерики же появились лишь во второй версии, а лямбда-выражения ещё позже. К тому же использование того или иного инструмента языка должно быть целесообразно, а это видно только в конкретном коде. Впрочем мне все равно кто что использует, это ведь они задают вопросы, а не я.

Цитата(PashaPash @  23.2.2009,  10:16 Найти цитируемый пост)
злобный даблкаст. 

Как раз недавно код у спрашивающего здесь человека был через as и is, а я привёл с try и (). Так ведь нет, сказали зачем я это сделал, если это не относится непосредственно к ошибке. Ну и пожалуйста, нужны зависимые операторы жрите.  В своих программах я использую такую запись как правило, так проще работать с разными языками дотнета.

Код

private void Form1_Load(object sender, System.EventArgs e)
{
    ClassifiedControls(this.Controls);
}

private void ClassifiedControls(Control.ControlCollection controls)
{
    foreach(Control control in controls)
    {
        try
        {
            MyTextboxOperation((TextBox)control);
        }
        catch (InvalidCastException)
        {
            ClassifiedControls(control.Controls);
        }
    }
}
        
void MyTextboxOperation(TextBox textBox)
{
    textBox.Text = "Вуаля!";
}



--------------------
user posted image
обычный день на винграде
PM   Вверх
Partizan
Дата 23.2.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Код

        try
        {
            MyTextboxOperation((TextBox)control);
        }
        catch (InvalidCastException)
        {
            ClassifiedControls(control.Controls);
        }


 smile
unicuum, вариант со "злобным даблкастом" лично мне нравился больше, чем этот =)


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
source777
Дата 23.2.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Цитата(unicuum @  23.2.2009,  16:03 Найти цитируемый пост)
        try
        {
            MyTextboxOperation((TextBox)control);
        }
        catch (InvalidCastException)
        {
            ClassifiedControls(control.Controls);
        }

Ужасть какая, оказывается если на форме оказалось что-то кроме TextBox`ов, то это уже исключительная ситуация.  smile 
Ну да ладно, is научился использовать, глядишь и до as скоро дело дойдёт и не будет злобного даблкаста...


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
DragonFire
Дата 24.2.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 14.8.2005
Где: Москва

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



Так, пасибо всем - отличная идея с рекурсивном обходом всех едитов)) Что-то сам сразу не додумался...
А насчет исключений - лучше уж использовать is ИМХО... 


--------------------
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




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


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

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