1

我正在尝试对从母版页继承的页面上的每个控件执行操作。我不知道如何访问子页面控件。我曾尝试像这样递归地访问我的控件:

    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

我宁愿直接访问我的控件(不递归)。否则,如何修改递归以获取所需页面的控件?

4

3 回答 3

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 的内置验证控件。你可以在这里阅读更多关于它们的信息。这具有在客户端上提供验证、提供更快的 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);
于 2013-08-06T17:42:27.143 回答
0

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

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

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

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

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

于 2013-08-06T17:41:58.343 回答
-1
public void ClearTextboxes(Page page) {
  GetAllControls(page)
    .Where(x => typeof(TextBox).IsAssignableFrom(x.GetType()))
    .ToList()
    .ForEach(x => ((TextBox)x).Enabled=false);
}
于 2018-04-19T17:00:14.920 回答