ASP.Net / C#,循环浏览页面上的某些控件?

时间:2011-02-25 21:37:07

标签: asp.net linq loops

我正在循环浏览页面上的所有控件,并在某些条件下将某些类型(TextBox,CheckBox,DropDownList等)设置为Enabled = False。 但是我注意到这样一个明显的页面加载循环增加。是否有可能只从Page.Controls对象获取某些类型的控件而不是循环遍历它们?可能还有像LINQ这样的东西?

3 个答案:

答案 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本身,扩展方法允许你进行迭代和执行。