我需要枚举一组控件 - 无论它们的嵌套级别如何 - 与给定的谓词匹配.
最初出现问题,当我需要将网格行中的所有文本框设置为ReadOnly,如果该行中的列指示该记录不应该是可编辑的.
后来我意识到,我已经解决了过去非常像这个问题,只有不同的标准(通过其ID递归找到一个控件).
在尝试了一些替代方案之后,我想出了一个有效的通用解决方案.但由于我会经常使用这种方法,我想收集可能的改进.
此方法将返回与谓词匹配的所有子控件:
public static IEnumerable<T> FindChildControls<T>(this Control parentControl,
Predicate<Control> predicate) where T : Control
{
foreach (Control item in parentControl.Controls) {
if (predicate(item))
yield return (T)item;
foreach (T child in item.FindChildControls<T>(predicate)) {
yield return child;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用此方法,我可以执行以下操作:
var allTxt = Page.FindChildControls<TextBox>(c => c is TextBox);
var submit = Page.FindChildControls<Button>(c => c.ID == "btnSubmit").First();
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以使用队列来摆脱递归.
public static IEnumerable<T> FindChildControls<T>(Control parentControl,
Predicate<Control> predicate) where T : Control
{
Queue<Control> q = new Queue<Control>();
foreach (Control item in parentControl.Controls)
{
q.Enqueue(item);
}
while (q.Count > 0)
{
Control item = q.Dequeue();
if (predicate(item))
yield return (T)item;
foreach (Control child in item.Controls)
{
q.Enqueue(child);
}
}
}
Run Code Online (Sandbox Code Playgroud)