[英]Iteration over dynamically added nested controls
我在WinForm上有一個GroupBox。 在運行時在第一個GroupBox中添加了另一個GroupBox。
在第二個GroupBox中添加了很少的PictureBox控件。
現在,我想迭代PictureBoxes。
目前,我的代碼是:
foreach (Control gbFirst in this.Controls)
{
GroupBox firstGroupBox = gbFirst as GroupBox; //First GroupBox
if (firstGroupBox != null)
{
foreach (Control gbSecond in firstGroupBox.Controls)
{
GroupBox secondGroupBox = gbSecond as GroupBox; //Second groupBox
if (secondGroupBox != null)
{
foreach (Control item in secondGroupBox.Controls)
{
var pb = item as PictureBox; // PictureBox
if (pb != null)
{
string pbTag = pb.Tag.ToString();
string customTag = ipAddress + "OnOff";
if (pb.Tag.ToString() == ipAddress + "OnOff")
{
MethodInvoker action = delegate
{
pb.Image = Properties.Resources.MobiCheckerOnPng16;
};
pb.BeginInvoke(action);
break;
}
}
}
}
}
}
}
但是,與上述不同,我認為可能有一種簡單或聰明的方法來做到這一點。
是這樣嗎?
在任何級別的任何容器中用於任何控件類型的通用函數:
public static List<T> FindControls<T>(Control container, bool dig) where T : Control
{
List<T> retVal = new List<T>();
foreach (Control item in container.Controls)
{
if (item is T)
retVal.Add((T)item);
if (dig && item.Controls.Count > 0)
retVal.AddRange(FindControls<T>(item, dig));
}
return retVal;
}
dig變量控制是否迭代子容器控件。 例如,如果要查找從第一個GroupBox(gbFirst)開始的所有PictureBox控件,則必須調用
FindControls<PictureBox>(gbFirst, true);
如果將dig設置為false,則僅枚舉輸入容器中的控件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.