Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Перебрать все дочерние контролы формы


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

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

Автор: nagg 23.2.2009, 08:46
Вот, кто то постил тут уже расширяющий метод:

Код

        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;
                }
            }
        }


Автор: unicuum 23.2.2009, 09:18
Цитата(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 = "Вуаля!";
}



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

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

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

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

Код

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


вот собсно все TextBox'ы в которых что-то написано (пример)

Автор: unicuum 23.2.2009, 16:03
Цитата(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 = "Вуаля!";
}

Автор: Partizan 23.2.2009, 16:34
Код

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


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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)