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

时间:2013-08-06 17:32:28

标签: c# asp.net

我正在尝试对从母版页继承的页面上的每个控件执行操作。我不知道如何访问子页面控件。我已尝试以递归方式获取我的控件:

    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

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

3 个答案:

答案 0 :(得分:2)

我建议使用基页而不是母版页,这样你的迭代控件的逻辑(以及之后用它做的任何事情)都不依赖于页面正在使用哪个母版页。

至于获取页面上的所有控件,因为控件是分层的,就像它们所代表的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的内置验证控件。您可以阅读更多相关信息here。这样做的另一个好处是可以在客户端上提供验证,提供更快的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 :(得分:0)

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

1 - 声明要访问的类型的变量。例如,如果要在子页面中访问Label,请使用:

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

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

ContentPlaceHolder1是您的内容持有者ID,因此请使用您的内容ID进行更改。

答案 2 :(得分:-1)

for jar in $(ls *jar); do unzip -l $jar ; done | grep -P '(^Archive|oracle.net.aso.C00)'