Мне нужно получить все элементы управления в форме типа x. Я почти уверен, что однажды видел этот код, в котором использовалось что-то вроде этого:
dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))
Я знаю, что могу перебирать все элементы управления, получая детей с помощью рекурсивной функции, но есть ли что-то более простое или более простое, например, следующее?
Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox
Ответы:
Вот вам еще один вариант. Я протестировал его, создав образец приложения, а затем поместил GroupBox и GroupBox в исходный GroupBox. Внутри вложенного GroupBox я поместил 3 элемента управления TextBox и кнопку. Это код, который я использовал (даже включает рекурсию, которую вы искали)
Чтобы проверить это в событии загрузки формы, мне нужно было подсчитать все элементы управления внутри исходного GroupBox.
И он каждый раз возвращал правильный счет, поэтому я думаю, что это отлично сработает для того, что вы ищете :)
источник
В C # (поскольку вы пометили его как таковой) вы можете использовать выражение LINQ, подобное этому:
Изменить для рекурсии:
В этом примере вы сначала создаете список элементов управления, а затем вызываете метод для его заполнения. Поскольку метод рекурсивен, он не возвращает список, а просто обновляет его.
Возможно, это удастся сделать в одном операторе LINQ с помощью
Descendants
функции, хотя я с ней не так хорошо знаком. См. Эту страницу для получения дополнительной информации об этом.Измените 2, чтобы вернуть коллекцию:
Как предположил @ProfK, вероятно, лучше использовать метод, который просто возвращает желаемые элементы управления. Чтобы проиллюстрировать это, я изменил код следующим образом:
источник
Это улучшенная версия рекурсивной функции GetAllControls (), которая действительно работает с частными варами:
источник
Я объединил кучу предыдущих идей в один метод расширения. Преимущества здесь заключаются в том, что вы получаете обратно правильно набранный перечислимый тип, а наследование правильно обрабатывается
OfType()
.источник
Для этого можно использовать запрос LINQ. Это запросит все в форме типа TextBox
источник
var c = this.Controls.OfType<TextBox>()
дало бы такого же результата?Это может быть древняя техника, но она работает как шарм. Я использовал рекурсию, чтобы изменить цвет всех меток элемента управления. Отлично работает.
источник
Я хотел бы изменить ответ PsychoCoders: поскольку пользователь хочет получить все элементы управления определенного типа, мы могли бы использовать дженерики следующим образом:
Таким образом, мы можем вызвать функцию следующим образом:
источник
.OfType<T>()
метод Linq, чем.Where(c => c.GetType() == typeof(T)).Cast<T>();
получить тот же эффект?Не забывайте, что вы также можете иметь TextBox внутри других элементов управления, кроме элементов управления контейнера. Вы даже можете добавить TextBox в PictureBox.
Так что вам также нужно проверить,
в любой рекурсивной функции.
Это результат, который я получил от макета для тестирования этого кода:
Попробуйте это с одной кнопкой и одним RichTextBox в форме.
источник
Использование отражения:
источник
Вот мой метод расширения
Control
с использованием LINQ в качестве адаптации версии @PsychoCoder :Вместо этого требуется список типов, который позволяет вам не требовать многократных вызовов
GetAll
для получения того, что вы хотите. В настоящее время я использую его как версию с перегрузкой.Использование:
источник
Чистое и простое решение (C #):
Получить все текстовые поля:
источник
Вы можете использовать приведенный ниже код
источник
Вот мой метод расширения. Это очень эффективно и лениво.
Использование:
Код такой:
источник
Вот решение.
https://stackoverflow.com/a/19224936/1147352
Я написал этот фрагмент кода и выбрал только панели, вы можете добавить дополнительные переключатели или если. в этом
источник
источник
Лямбда-выражения
источник
Я модифицировал @PsychoCoder. Все элементы управления теперь можно найти (включая вложенные).
источник
Это может сработать:
Я думаю, что функция получения всех элементов управления, о которых вы говорите, доступна только в WPF .
источник
Вот проверенное и работающее универсальное решение:
У меня есть большое количество элементов управления UpDownNumeric, некоторые в основной форме, некоторые в групповых ящиках внутри формы. Я хочу, чтобы только один последний выбранный элемент управления изменил задний цвет на зеленый, для чего я сначала установил все остальные на белый, используя этот метод: (также может расширяться до внуков)
источник
Вы можете попробовать это, если хотите :)
источник
Хотя несколько других пользователей опубликовали адекватные решения, я хотел бы опубликовать более общий подход, который может быть более полезным.
Это во многом основано на ответе Дж. Йелтона.
источник
источник
источник
Для тех, кто ищет версию кода Адама C # на VB, написанную как расширение
Control
класса:ПРИМЕЧАНИЕ: я добавил
BaseType
сопоставление для любых производных настраиваемых элементов управления. Вы можете удалить это или даже сделать его необязательным параметром, если хотите.использование
источник
Создать метод
И используйте это как
источник
Я хорошо использую VB, поэтому я написал метод расширения. Это извлекает всех дочерних и дочерних элементов управления
Затем вы можете использовать это как, где "btnList" - это элемент управления
В этом случае он выберет выбранную радиокнопку.
источник
Просто:
источник