我正在循环浏览页面上的所有控件,并在某些条件下将某些类型(TextBox,CheckBox,DropDownList等)设置为Enabled = False。 但是我注意到这样一个明显的页面加载循环增加。是否有可能只从Page.Controls对象获取某些类型的控件而不是循环遍历它们?可能还有像LINQ这样的东西?
答案 0 :(得分:14)
这不能完全使用LINQ完成,但你可以有一个像这样定义的扩展
static class ControlExtension
{
public static IEnumerable<Control> GetAllControls(this Control parent)
{
foreach (Control control in parent.Controls)
{
yield return control;
foreach (Control descendant in control.GetAllControls())
{
yield return descendant;
}
}
}
}
并致电
this.GetAllControls().OfType<TextBox>().ToList().ForEach(t => t.Enabled = false);
答案 1 :(得分:5)
你可以循环遍历所有控件(嵌套的控件):
private void SetEnableControls(Control page, bool enable)
{
foreach (Control ctrl in page.Controls)
{
// not sure exactly which controls you want to affect so just doing TextBox
// in this example. You could just try testing for 'WebControl' which has
// the Enabled property.
if (ctrl is TextBox)
{
((TextBox)(ctrl)).Enabled = enable;
}
// You could do this in an else but incase you want to affect controls
// like Panels, you could check every control for nested controls
if (ctrl.Controls.Count > 0)
{
// Use recursion to find all nested controls
SetEnableControls(ctrl, enable);
}
}
}
然后使用以下内容初始调用它以禁用:
SetEnableControls(this.Page, false);
答案 2 :(得分:0)
我喜欢此链接中的解决方案LINQ equivalent of foreach for IEnumerable<T>
对我来说工作得很好!
您可以使用linq查询(例如
)进行控件的迭代 (from ctrls in ModifyMode.Controls.OfType<BaseUserControl>()
select ctrls).ForEach(ctrl => ctrl.Reset());
这里BaseUserControl是我所有控件都使用的基类,你可以在这里使用Control本身,扩展方法允许你进行迭代和执行。