我正在尝试对从母版页继承的页面上的每个控件执行操作。我不知道如何访问子页面控件。我已尝试以递归方式获取我的控件:
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
我更喜欢直接访问我的控件(没有递归)。否则,我如何修改递归以获得所需页面的控件?
答案 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)'