Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Nalik
176 / 124 / 49
Регистрация: 30.11.2012
Сообщений: 1,330

Перебор всех дочерних контролов программы

18.11.2016, 13:00. Показов 2975. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть форма, на форме расположены панели, табконтролы, лейблы и много всего.
Хочу сохранить в файл имена всех контролов и подконтролов существующих в программы (в том числе items из combobox), но не знаю как правильно перебрать дочерние конролы. Кодом ниже получаю список контролов на основной форме.
C#
1
2
3
4
foreach (Control control in Controls)
{
                   
}
Добавлено через 3 минуты
Как добраться до дочерних я тоже знаю, но как перебрать все дочерние в автомате.. как правильно написать код..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
foreach (Control control in Controls)
                {
                    if(control.Controls.Count != 0)
                    {
                        foreach (Control control1 in control.Controls)
                        {
                            if (control1.Controls.Count != 0)
                            {
                                foreach (Control control2 in control1.Controls)
                                {
                                    //и т.д.
                                }
                            }
                        }
                    }
               }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2016, 13:00
Ответы с готовыми решениями:

Поиск дочерних контролов
Подскажите , есть несколько лейблов , и некоторые друг на друге , и когда щелкаю на верхний лейбл , нужно узнать есть ли под ним ещё

Клонирование панели с контролами. Свойства дочерних контролов сохраняются частично
Не могу понять, в чём дело. Клон панели создаётся, все контролы присутствуют, свойства панели сохраняются, свойства дочерних контролов -...

Перебор контролов формы
Доброго времени суток всем, столкнулся с тривиальной задачей: перебрать все контролы на форме включая дочерние, но почему то...

5
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
18.11.2016, 13:04
Nalik, есть такое слово - рекурсия
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
18.11.2016, 13:06
Лучший ответ Сообщение было отмечено Nalik как решение

Решение

Nalik, рекурсия спасет тебя
C#
1
2
3
4
5
6
7
void TraverseControls(Control ctrl)
{
    foreach (Control childCtrl in ctrl.Controls)
    {
        TraverseControls(childCtrl);
    }
}
2
34 / 20 / 4
Регистрация: 07.03.2015
Сообщений: 334
30.12.2017, 01:52
Цитата Сообщение от OwenGlendower Посмотреть сообщение
рекурсия спасет тебя
Как через рекурсию узнать какой контрол на форме имеет фокус?

Ибо почему-то у переменной childCtrl нету свойства .Focused, но если в отладке смотреть то оно есть.
Что за фигня такая?

Добавлено через 49 минут
А все оказывается просто, тупо пишешь свойство)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void FindFocus(Control cnt, ref Control focus)
{ 
    foreach (Control c in cnt.Controls)
    {
        if (c.Focused) {
            focus = c;
            break;
        }
        if (focus == null)
            FindFocus(c, ref focus);
        else
            break;
    }
}
Только я вот одного не понял как без ref'a правильно выйти из рекурсии и вернуть контрол с фокусом? - может кто подскажет.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
30.12.2017, 02:14
Цитата Сообщение от Fakels Посмотреть сообщение
Ибо почему-то у переменной childCtrl нету свойства .Focused
Попробуй еще раз. У класса Control есть свойство Focused


Добавлено через 4 минуты
Цитата Сообщение от Fakels Посмотреть сообщение
Только я вот одного не понял как без ref'a правильно выйти из рекурсии и вернуть контрол с фокусом? - может кто подскажет.
Почему бы не использовать обычный return вместо ref?
C#
1
2
3
4
5
6
7
8
9
10
private Control FindFocus(Control cnt)
{ 
    foreach (Control c in cnt.Controls)
    {
        if (c.Focused) return c;
        var focusedCtrl = FindFocus(c);
        if (focusedCtrl != null) return focusedCtrl;
    }
    return null;
}
1
30.12.2017, 02:57

Не по теме:

OwenGlendower, Ну ты голова, работает выход)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.12.2017, 02:57
Помогаю со студенческими работами здесь

Сохранение панели и всех её контролов в файл
Всем привет! Возник такой вопрос: возможно ли сохранить панель и все её контролы в один какой то файл? Например в файл .xml. При этом на...

Перебор всех ветвей в treeView
Имеется элемент treeView с кучей ветвей, у каждой ветки есть дочерние, у тех в свою очередь тоже дочерние и т.д. Получается глубокая...

Добавление контролов с обработчиками во время выполнения программы
Как добавлять и удалять контролы с обработчиками событий для них во время выполнения программы? Допустим, я хочу, чтобы при нажатии на...

Изменение размеров и перетаскивание контролов во время выполнения программы
День добрый! Кто нибудь сталкивался с таким вопросом? Я нашел, вот такую статью. Но может быть есть стандартные варианты решения?

Перебор всех комбинаций символов заданного алфавита
Задача такова: есть алфавит, состоящий примерно из 40 символов. Задана комбинация из 6 произвольных символов этого алфавита. Необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru