使用母版页循环浏览页面上的控件
本文关键字:控件 浏览 母版页 循环 | 更新日期: 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);
}