使用母版页循环浏览页面上的控件

本文关键字:控件 浏览 母版页 循环 | 更新日期: 2023-09-27 18:26:41

我正试图对从母版页继承的页面上的每个控件执行操作。我不知道如何访问子页面控件。我尝试过递归地访问我的控件,如下所示:

    private void checkControls(ControlCollection controlcollection)
   {
    foreach (Control control in controlcollection)
    {
        if (control.Controls.Count > 0)
        {
            Debug.WriteLine(control.GetType().ToString());
            checkControls(control.Controls);
        }
        else
        {
            Debug.WriteLine(control.GetType().ToString());
        }
    }

该方法被称为:

protected void resettodefault()
{
    checkControls(this.Page.Controls);
}

然而,通过该执行打印的唯一控件是:

ASP.site_master
System.Web.UI.LiteralControl

我更喜欢直接访问我的控件(不使用递归)。否则,如何修改递归以获得所需页面的控件?

使用母版页循环浏览页面上的控件

我建议使用基页而不是母版页,这样一来,迭代控件的逻辑(以及之后要做的任何事情)就不会与页面使用的母版页绑定在一起。

至于获取页面上的所有控件,因为控件是分层的,就像它们所代表的HTML一样,所以递归地迭代它们是有意义的。然而,如果你已经下定决心不递归地获得控件,那么这样的东西应该会起作用:

IEnumerable<Control> GetAllControls()
{
    var allControls = new List<Control>();
    var currentControls = new Queue<Control>();
    currentControls.Enqueue(this.Page);
    while (currentControls.Count >0)
    {
        var c = currentControls.Dequeue();
        if (!allControls.Contains(c))
        {
            allControls.Add(c);
            if (c.Controls != null && c.Controls.Count > 0)
            {
                foreach (Control e in c.Controls)
                {
                    currentControls.Enqueue(e);
                }
            }
        }
    }
    return allControls;
}

最后要考虑的是页面的生命周期,以及何时对控件进行迭代。若你们试图过早地走向控制树,并不是所有的控制都存在。

编辑:更新代码。

更新

出于验证目的,我强烈建议使用asp.net的内置验证控件。您可以在这里阅读更多关于它们的信息。这还有一个额外的好处,即在客户端上提供验证,提供更快的UI响应,并减轻服务器的负载。

用于重置所有文本框。我建议为此创建一个新的类,然后在需要时调用该类,而不是扰乱主页面:

public class UIControlsHelper
{
    public static void ClearTextboxes(Page page)
    {
        GetAllControls(page)
            .Where(x => typeof(TextBox).IsAssignableFrom(x.GetType())
            .ToList()
            .ForEach(x => (TextBox)x.Text = string.Empty);
    }
    IEnumerable<Control> GetAllControls(Page page)
      // Same as above, but with the page parameter replaced.
    }
}

在您的任何页面中:

UIControlsHelper.ClearTextboxes(this);

要访问子页面中的控件,请执行以下步骤:

1-标记要访问的类型的变量。例如,如果您想访问子页面中的标签,请使用:

Label lbl_child=this.ContentPlaceHolder1.findcontrol("your label id in child page") as Label;

现在您有了标签,可以对其进行更改。此控件上的每一项更改都将反映在子控件上。

ContentPlaceHolder1是您的contentplaceholder id,因此请使用您的内容id更改它。

public void ClearTextboxes(Page page) {
  GetAllControls(page)
    .Where(x => typeof(TextBox).IsAssignableFrom(x.GetType()))
    .ToList()
    .ForEach(x => ((TextBox)x).Enabled=false);
}