C# 是否查找与谓词匹配的所有ASP.NET控件?
我需要枚举与给定谓词匹配的控件集合,而不管它们的嵌套级别如何 最初,当我需要将网格行中的所有文本框设置为C# 是否查找与谓词匹配的所有ASP.NET控件?,c#,.net,asp.net,C#,.net,Asp.net,我需要枚举与给定谓词匹配的控件集合,而不管它们的嵌套级别如何 最初,当我需要将网格行中的所有文本框设置为ReadOnly,如果该行中的一列指示该记录不应编辑时,问题就出现了 后来我意识到,我在过去已经解决了一个问题,非常像这个问题,只是使用了不同的标准(通过ID递归查找单个控件) 在尝试了一些替代方案后,我想出了一个通用的解决方案。但由于我将经常使用这种方法,我想收集可能的改进 此方法将返回与谓词匹配的所有子控件: 公共静态IEnumerable FindChildControl(此控件为pa
ReadOnly
,如果该行中的一列指示该记录不应编辑时,问题就出现了
后来我意识到,我在过去已经解决了一个问题,非常像这个问题,只是使用了不同的标准(通过ID递归查找单个控件)
在尝试了一些替代方案后,我想出了一个通用的解决方案。但由于我将经常使用这种方法,我想收集可能的改进
此方法将返回与谓词匹配的所有子控件:
公共静态IEnumerable FindChildControl(此控件为parentControl,
谓词(谓词),其中T:Control
{
foreach(parentControl.Controls中的控件项){
if(谓语(项))
收益回报(T)项;
foreach(item.FindChildControls(谓词)中的T子级){
退换子女;
}
}
}
使用此方法,我可以执行以下操作:
var allTxt = Page.FindChildControls<TextBox>(c => c is TextBox);
var submit = Page.FindChildControls<Button>(c => c.ID == "btnSubmit").First();
var allTxt=Page.FindChildControls(c=>c是文本框);
var submit=Page.FindChildControls(c=>c.ID==“btnSubmit”).First();
如果需要,可以使用队列来消除递归
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);
}
}
}
公共静态IEnumerable FindChildControl(Control parentControl,
谓词(谓词),其中T:Control
{
队列q=新队列();
foreach(parentControl.Controls中的控件项)
{
q、 排队(项目);
}
而(q.Count>0)
{
控制项=q.出列();
if(谓语(项))
收益回报(T)项;
foreach(item.Controls中的控件子级)
{
q、 排队(儿童);
}
}
}
如果需要,可以使用队列来消除递归
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);
}
}
}
公共静态IEnumerable FindChildControl(Control parentControl,
谓词(谓词),其中T:Control
{
队列q=新队列();
foreach(parentControl.Controls中的控件项)
{
q、 排队(项目);
}
而(q.Count>0)
{
控制项=q.出列();
if(谓语(项))
收益回报(T)项;
foreach(item.Controls中的控件子级)
{
q、 排队(儿童);
}
}
}
这实际上非常整洁,在我的情况下(重页面控制树,每次渲染使用约4-5次),你认为这会是最佳的吗?这实际上非常整洁,在我的情况下(重页面控制树,每次渲染使用约4-5次),你认为这会是最佳的吗?我很喜欢你的版本!简洁的解决方案。我很喜欢你的版本!纯溶液。