У меня есть несколько картинных ящиков, и мне нужно загрузить в них случайные изображения во время работы. Поэтому я подумал, что было бы неплохо иметь коллекцию всех графических ящиков, а затем назначать изображения им с помощью простого цикла. Но как мне это сделать? Или, может быть, есть ли другие более эффективные решения этой проблемы?Получить все элементы управления определенного типа
ответ
Использование немного LINQ:
foreach(var pb in this.Controls.OfType<PictureBox>())
{
//do stuff
}
Однако, это займет только забота о PictureBoxes в главном контейнере.
Вы можете использовать этот метод:
public static IEnumerable<T> GetControlsOfType<T>(Control root)
where T : Control
{
var t = root as T;
if (t != null)
yield return t;
var container = root as ContainerControl;
if (container != null)
foreach (Control c in container.Controls)
foreach (var i in GetControlsOfType<T>(c))
yield return i;
}
Тогда вы могли бы сделать что-то вроде этого:
foreach (var pictureBox in GetControlsOfType<PictureBox>(theForm)) {
// ...
}
Я думаю, что это на самом деле более словнее, чем просто 'root.Controls.OfType
О, я вижу, вы дошли до бесконечной глубины. Попался. –
не совсем Дэн Тао, если PictureBox находится в дополнительном контейнере, версия LINQ не получит его. – Femaref
Если вы по крайней мере на .NET 3.5, то у вас есть LINQ, что означает, что поскольку ControlCollection
реализует IEnumerable
вы можете просто сделать:
var pictureBoxes = Controls.OfType<PictureBox>();
Это не будет учитывать PictureBoxes, которые вложены в другие контейнеры. – cdhowie
Право. В моей защите ОП не уточнил, было ли это требование; но тем не менее, было бы разумно рассматривать его как таковое. –
Я использую этот GENERI c рекурсивный метод:
Предполагается, что если элемент управления имеет значение T, то метод не выглядит в его дочерних элементах. Если вам нужно также посмотреть на своих детей, вы можете легко изменить его соответствующим образом.
public static IList<T> GetAllControlsRecusrvive<T>(Control control) where T :Control
{
var rtn = new List<T>();
foreach (Control item in control.Controls)
{
var ctr = item as T;
if (ctr!=null)
{
rtn.Add(ctr);
}
else
{
rtn.AddRange(GetAllControlsRecusrvive<T>(item));
}
}
return rtn;
}
public static List<T> FindControlByType<T>(Control mainControl,bool getAllChild = false) where T :Control
{
List<T> lt = new List<T>();
for (int i = 0; i < mainControl.Controls.Count; i++)
{
if (mainControl.Controls[i] is T) lt.Add((T)mainControl.Controls[i]);
if (getAllChild) lt.AddRange(FindControlByType<T>(mainControl.Controls[i], getAllChild));
}
return lt;
}
Вот еще один вариант, так как существующие, предоставленные из них были не совсем то, что я имел в виду. Этот метод, возможно, работает как метод расширения и исключает проверку типа корневого/родительского контейнера. Этот метод в основном «Получить все потомка управления типа Т» метод:
public static System.Collections.Generic.IEnumerable<T> ControlsOfType<T>(this System.Web.UI.Control control) where T: System.Web.UI.Control{
foreach(System.Web.UI.Control childControl in control.Controls){
if(childControl is T) yield return (T)childControl;
foreach(var furtherDescendantControl in childControl.ControlsOfType<T>()) yield return furtherDescendantControl;
}
}
- 1. Получить все элементы определенного типа из списка абстрактного типа
- 2. получить все элементы управления типа и изменить их свойства
- 3. LINQ - получить все элементы определенного типа в списке объекта
- 4. Получить все элементы определенного типа вида от superView
- 5. Как получить все дочерние элементы определенного типа в корневом макете?
- 6. Найти все элементы управления типа в UIView
- 7. Захватить все XML-элементы определенного типа: даже вложенные элементы
- 8. Получить все элементы управления winform?
- 9. Получите все элементы управления из композитного материала для определенного типа управления
- 10. Получить все XML ChildNodes определенного типа
- 11. Как получить все записи определенного типа?
- 12. Получить элементы управления типа и имени
- 13. Silverlight: Найти все элементы управления типа в макете
- 14. Как получить все компоненты AutoFac определенного типа?
- 15. Невозможно выбрать элементы определенного типа
- 16. Удаление определенного типа детей из управления сеткой
- 17. Получить все элементы управления от MasterPage ChildPage
- 18. Как получить все элементы управления TextBox карточки
- 19. WinRT - получить все элементы управления от codebehind
- 20. получить все элементы управления с помощью FindWindowEx
- 21. Получить все элементы управления внутри AjaxControlToolkit.TabPanel programatically
- 22. Как получить все узлы в графике определенного типа корабля типа
- 23. Как найти все xml-элементы определенного типа с помощью xpath?
- 24. Сериализация Как динамически игнорировать все элементы определенного типа
- 25. Как подсчитать все элементы определенного типа в объекте jQuery?
- 26. Выберите все элементы определенного типа с определенным классом
- 27. Как найти все элементы в массиве определенного типа?
- 28. Найти все дочерние элементы управления определенного типа с помощью Enumerable.OfType <T>() или LINQ
- 29. Как найти все элементы управления определенного типа на странице внутри главной страницы?
- 30. Получить все экземпляры типа элемента управления на основе параметра
Это не будет рассматривать PictureBoxes, которые вложены в другие контейнеры. – cdhowie
В качестве альтернативы ... Еогеасп (PictureBox рь в this.Controls.OfType()) { // делать вещи } Не уверен, что это имеет огромное значение, но я, как правило, отдают предпочтение явного объявления , –
Scooter
Что-то вроде этого: https: // stackoverflow.com/questions/47182809/how-to-count-the-checkboxes-in-asp-net-form/47182982 # 47182982 – Si8