Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用母版页在页面上的控件之间循环_C#_Asp.net - Fatal编程技术网

C# 使用母版页在页面上的控件之间循环

C# 使用母版页在页面上的控件之间循环,c#,asp.net,C#,Asp.net,我试图对从母版页继承的页面上的每个控件执行操作。我不知道如何访问子页面控件。我尝试过递归地访问我的控件,如下所示: private void checkControls(ControlCollection controlcollection) { foreach (Control control in controlcollection) { if (control.Controls.Count > 0) {

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

    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);
}
该方法的调用方式如下:

    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

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

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

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

Label lbl_child=this.ContentPlaceHolder1.findcontrol("your label id in child page") as Label;
现在你有了你的标签,你可以自由地对其进行更改。此控件上的每个更改都将反映在子控件上


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

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

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

Label lbl_child=this.ContentPlaceHolder1.findcontrol("your label id in child page") as Label;
现在你有了你的标签,你可以自由地对其进行更改。此控件上的每个更改都将反映在子控件上


ContentPlaceholder 1是您的ContentPlaceholder id,因此请使用您的内容id对其进行更改。

我建议使用基页而不是母版页,这样,您在控件上进行迭代的逻辑(以及以后将执行的任何操作)就不会与页面使用的母版页相关联

至于获取页面上的所有控件,因为控件是分层的,就像它们所表示的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;
}

我建议使用一个基页而不是母版页,这样,您在控件上进行迭代的逻辑(以及之后您将如何处理)就不会与页面使用的母版页相关联

至于获取页面上的所有控件,因为控件是分层的,就像它们所表示的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.site\u master”和“System.Web.UI.LiteralControl”。Site_master在第一次调用时发生,LiteralControl在第二次调用时发生,函数在此之后结束。你知道为什么会这样吗?你期望结果是什么?我有两个不同的目标,我用它来实现。一个是“全部清除”按钮,它可以简单地清除页面上的每个文本框。另一种是验证,它检查每个文本框的空值,并在文本框为空时向用户发出警告。我可以在检查和验证中硬编码,但是,有15个文本框-我想找到一个更优雅的解决方案。这是一个非常酷的队列使用-谢谢你,以及在基本页上的参考。我可能应该更清楚,当我循环访问控件(递归或迭代)时遇到的问题是,我只返回了“ASP.site\u master”和“System.Web.UI.LiteralControl”。Site_master在第一次调用时发生,LiteralControl在第二次调用时发生,函数在此之后结束。你知道为什么会这样吗?你期望结果是什么?我有两个不同的目标,我用它来实现。一个是“全部清除”按钮,它可以简单地清除页面上的每个文本框。另一种是验证,它检查每个文本框的空值,并在文本框为空时向用户发出警告。我可以在检查和验证中硬编码,但是,有15个文本框-我想找到一个更优雅的解决方案。OP尝试在没有硬编码控件名称的情况下实现这一点。OP尝试在没有硬编码控件名称的情况下实现这一点。请在回答中添加解释请在回答中添加解释