迭代动态添加的嵌套控件
Iteration over dynamically added nested controls
我在 WinForm 上有一个 GroupBox。在第一个 GroupBox 中的 运行 时间内添加了另一个 GroupBox。
在第二个 GroupBox 中添加了几个 PictureBox 控件。
现在我想迭代图片框。
目前我的代码是:
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,则只会枚举输入容器中的控件。
我在 WinForm 上有一个 GroupBox。在第一个 GroupBox 中的 运行 时间内添加了另一个 GroupBox。
在第二个 GroupBox 中添加了几个 PictureBox 控件。
现在我想迭代图片框。
目前我的代码是:
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,则只会枚举输入容器中的控件。