【问题标题】:ASP.Net / C#, Loop through certain controls on a page?ASP.Net / C#,循环浏览页面上的某些控件?
【发布时间】:2011-02-25 21:37:06
【问题描述】:

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

【问题讨论】:

  • 你能发布示例代码吗?我认为迭代 Page.Controls 本身不会对性能造成太大影响。

标签: asp.net linq loops


【解决方案1】:

这不能完全使用 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);

【讨论】:

  • 美观直接。
【解决方案2】:

您可以遍历所有控件(嵌套的):

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);  

【讨论】:

  • OP 询问是否有任何方法可以在不循环的情况下做到这一点。
  • @kevev22:您想如何从没有任何循环的嵌套控件中获取页面的某些控件类型?没有页面函数 getControls(Type type) 从给定类型返回所有​​控件,并且 linq 也会循环。
  • @kevev22 我认为没有办法不进行某种循环和递归......你能告诉我如何在没有火箭飞船的情况下到达月球:)
  • 我并不是说没有循环就可以做到这一点。问题是“有没有办法在不循环的情况下做到这一点?”。我认为一个完整的答案应该从“不,没有循环就没有办法做到这一点,但是因为你必须在这里循环是一种很好的方式”。
  • @kevev22:我同意。 @Kelsey:如果它能够将类型作为应该启用/禁用的控件的参数传递,这个答案会更好。对于这个问题,这种方法有些静态。
【解决方案3】:

我喜欢这个链接中的解决方案LINQ equivalent of foreach for IEnumerable<T>

对我来说效果很好!

您可以使用像

这样的 linq 查询来进行控件的迭代
    (from ctrls in ModifyMode.Controls.OfType<BaseUserControl>()

                 select ctrls).ForEach(ctrl => ctrl.Reset());

这里BaseUserControl是我所有控件都使用的基类,你可以在这里很好地使用Control本身,扩展方法可以让你俱乐部迭代和执行。

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    相关资源
    最近更新 更多