Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1

Отключение/включение (активация/де активация) одновременно всех (нескольких) компонентов на форме

07.09.2017, 10:09. Показов 6365. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день коллеги! Возник такой вопрос. Допустим, есть форма с множеством элементов ввода, кнопок, в общем всевозможных компонентов. Допустим, есть кнопка (или несколько), по нажатии на которую, выполняется некая НЕ мгновенная команда, или расчёт, за время выполнения которой (которого), больше ничего на форме нажимать или вводить не желательно, пока команда не отработает, после чего можно снова разрешить работу с компонентами формы. Конечно, запретить любое взаимодействие со всей формой и её компонентами, включительно, можно банально с помощью this.Enabled = false; и с практической точки зрения этого в общем-то достаточно. Но хотелось бы наглядно реализовать эстетическую сторону. Т.е. когда у некоторых компонентов формы свойство Enabled выставляем в false, они как бы обесцвечиваются, что наглядно демонстрирует пользователю их не активность на данный момент, но вот когда мы де активируем только лишь форму (this.Enabled = false;), то при этом все компоненты на ней, хоть и становятся не активными, но не обесцвечиваются при этом.
Когда на форме компонентов достаточно много, не охота для каждого отдельно задавать свойство Enabled, по этому вопрос к вам, коллеги: как можно минимизировать эту задачу? Есть у меня подозрение, что можно как-то через цикл foreach "для каждого компонента формы" одним условием задавать свойство Enabled всем компонентам формы. Но во-первых с таким циклом мне крайне мало доводилось работать, а во-вторых, если действительно можно им обойтись, то как вот это условие ("для каждого компонента формы") правильно в нём записать?
Конечно, если есть другие предложения по реализации данного вопроса, с радостью рассмотрю их. Заранее всем спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2017, 10:09
Ответы с готовыми решениями:

Включение\отключение всех СheckBox`ов на форме одной кнопкой
Задача: на форме присутствует 25 элементов типа CheckBox. Чтобы не тыкать в каждый, надо сообразить кнопку "Включить/выключить...

Активация элемента одновременно с введением данных
Ситуация: из следующего хтмл я получаю значения в js посредством клика по элементам списка. <div id="typeK"> ...

Активация нескольких форм
Такой глупый вопрос появился.. Есть оконное приложение из двух форм, главная и форма поиска по главной. Допустим мы вызвали, по...

10
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
07.09.2017, 10:44
Cha1000000, пройтись по всем однотипным контролам можно так:
C#
1
2
3
4
5
6
7
8
9
//Пример обхода всех TextBox-ов
foreach (Control control in Controls)
{
    TextBox tb = control as TextBox;
    if (tb != null)
    {
        tb.Text = "Text";
    }
}
Это отсюда: Ответы на 7 самых частых вопросов по WinForms Пункт 7

Ещё как вариант могу предложить сразу после блокировки формы выводить поверх неё панельку с прогрессбаром.
1
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
07.09.2017, 10:53
Все родительские "вырубить" вот так:
C#
1
2
3
4
foreach (Control control in this.Controls)
            {
                control.Enabled = false;
            }
НО, решение не очень если честно, лучше выводите какое-либо сообщение на момент работы, а то юзер может подумать что всё зависло
1
1167 / 885 / 517
Регистрация: 09.04.2014
Сообщений: 2,098
07.09.2017, 11:06
Киньте на форму панель и на ней разместите свои элементы управления - деактивация панели сделает все как вы хотите.
2
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
07.09.2017, 11:13  [ТС]
Цитата Сообщение от FaceHoof Посмотреть сообщение
Ещё как вариант могу предложить сразу после блокировки формы выводить поверх неё панельку с прогрессбаром.
Спасибо, за разъяснение с foreach! А по поводу прогрессбара, да, я его тоже использую, но в местах где обработка команды занимает гараздо больше времени и идёт, например, сохранение, или загрузка каких-либо данных...

Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
лучше выводите какое-либо сообщение на момент работы, а то юзер может подумать что всё зависло
Это тоже, верно! Как раз в тему вышепредложенного прогрессбара. Можно ещё крутящийся индикатор например выводить... Но опять же, это когда команда дольше 1-3 секунд отрабатывает. А если её выполнение занимает в пределах одной-двух секунд, мне лишние мэседжбоксы ни к чему...
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
07.09.2017, 11:34
Cha1000000, а что плохого то в прогрессбаре, который будет висеть всего две секунды? Не надо же делать огромную панель со стеной текста. Просто маленькая аккуратная панелька по центру. Да и потом, если этот процесс где-то сильно "задумается" почему-то?
0
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
08.09.2017, 10:01  [ТС]
Цитата Сообщение от nedel Посмотреть сообщение
Киньте на форму панель и на ней разместите свои элементы управления - деактивация панели сделает все как вы хотите.
О! А у меня как раз на форме элементы сгруппированы по панелям. Только я не пробовал деактивировать именно их. Попробую. Спасибо за идею!

Добавлено через 1 минуту
Цитата Сообщение от FaceHoof Посмотреть сообщение
Не надо же делать огромную панель со стеной текста. Просто маленькая аккуратная панелька по центру. Да и потом, если этот процесс где-то сильно "задумается" почему-то?
Однако, учту. Спасибо!

Добавлено через 22 часа 10 минут
Цитата Сообщение от FaceHoof Посмотреть сообщение
1
,
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
2
, ещё раз благодарю, коллеги, за информацию! Всё хорошо получилось и работает. А вот как раз в тему обхода всех контролов хотел бы задать ещё такой вопрос.
Вот, например, на форме есть N-е количество checkBox'ов и при нажатии кнопки, хотелось бы сделать проверку: если не один из них не отмечен (если у всех свойство .Checked == false, то выводить соответствующее сообщение, что мол "ничего не выбрано". Пробовал сделать по примеру:
Цитата Сообщение от FaceHoof Посмотреть сообщение
//Пример обхода всех TextBox-ов
foreach (Control control in Controls)
{
* * TextBox tb = control as TextBox;
* * if (tb != null)
* * {
* * * * tb.Text = "Text";
* * }
}
только вместо TextBox, естественно, checkBox выставлял, и проверку:
C#
1
2
3
4
5
if (cb != null)
{
   if (!cb.Checked)
   MessageBox.Show("Ничего не выбрано!.", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
но, желаемого результата не получил . При пошаговой отладке вижу, что после строки if (cb != null) во внутрь не заходит ни на одном шагу из N checkBox'ов, а проскакивает дальше. Более того, чекбоксов, например 23, а итераций по циклу всего парочка прошла и шаги пошли уже дальше этого цикла по коду... Подскажите, в чём тут может быть ошибка, или недочёт? Либо, какие можно альтернативные решения для этой проверки применить?
0
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,311
Записей в блоге: 14
08.09.2017, 10:06
C#
1
2
3
4
if (!this.Controls.OfType<CheckBox>().Any(x => x.Checked))
{
  MessageBox.Show("Ничего не выбрано!.", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
0
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
08.09.2017, 10:07
Cha1000000, предполагаю что твои чекбоксы лежат не на самой форме, следовательно нужно искать их в дочерних того элемента где они лежат, панель/групбокс
1
6 / 5 / 3
Регистрация: 04.06.2015
Сообщений: 250
Записей в блоге: 1
08.09.2017, 10:36  [ТС]
Цитата Сообщение от SeIZVeIZ Посмотреть сообщение
предполагаю что твои чекбоксы лежат не на самой форме
Да, именно так. Действительно, они лежали не на самой форме, а на группбоксе... Пардон, коллеги, сам только сообразил, что надо было конкретно указать, что контролы относятся к группбоксу: foreach (var cb in groupBox1.Controls.OfType<CheckBox>()). Не сразу сообразил, за то теперь разобрался. Спасибо всем за оперативное участие в обсуждении ;-)

Цитата Сообщение от Rius Посмотреть сообщение
if (!this.Controls.OfType<CheckBox>().Any(x => x.Checked))
Так тоже заработало, только прошу пояснить немного эту запись. Почему, если мои чекбоксы лежат на напрямую на форме, а на группбоксе, при такой записи с this.Controls.OfType<CheckBox> оно всё равно РАБОТАЕТ?) Почему в этом случае не нужно было указать например так: groupBox1.Controls.OfType<CheckBox>? И, если можно, объясните вот эту запись: .Any(x => x.Checked), пожалуйста.
0
Эксперт .NET
 Аватар для Rius
13092 / 7651 / 1672
Регистрация: 25.05.2015
Сообщений: 23,311
Записей в блоге: 14
08.09.2017, 10:49
Цитата Сообщение от Cha1000000 Посмотреть сообщение
Почему в этом случае не нужно было указать например так: groupBox1.Controls.OfType<CheckBox>?
Нужно, нужно. Вам только кажется. Для рекурсивного перебора будет сложнее.
Цитата Сообщение от Cha1000000 Посмотреть сообщение
.Any(x => x.Checked)
Метод Enumerable.Any<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>).
Возвращает true, если Any (хотя бы один любой) элемент x соответствует условию x.Checked ( == true ), т. е. Func() для этого элемента возвращает true.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2017, 10:49
Помогаю со студенческими работами здесь

Активация ячейки на форме
Здравствуйте Форумчане!!! Помогите пожалуйста облегчить работу по вводу данных в форме. Проблема такая: на форме две ячейки (КодПростоя...

Активация запроса на добавление данных по кнопке в форме
Всем привет! Я - почти совсем нуб в Access, поэтому заранее прошу прощения за возможную бестактность вопроса. Создал базу данных, пару...

Активация всех чекбоксов по одному
Здарова. Имеется таблица, первый тег &lt;tr&gt; - типа заголовка, в котором содержится главный чекбокс. В остальных &lt;tr&gt; содержится...

Ошибка в шаге развёртывания "Активация компонентов"
Ошибка в шаге развёртывания &quot;Активация компонентов&quot;: Не удалось завершить это действие из-за наличия недопустимого определения компонента...

ASUS P5KC vs Sound Blaster Audigy 2 ZS. Активация всех разъемов.
Вкратце. Есть материнская плата ASUS P5KC (http://www.websib.net/modules/sections/index.php?op=viewarticle&amp;artid=29) Есть...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru