我要做的是访问Page_Load中的页面控件,进行数据库查询,并使控件可见或不可见。
以下是代码:
foreach (Control thiscontrol in ContentPlaceHolderBody.Controls) {
try {
if (thiscontrol.ID.Contains("TextBox") || thiscontrol.ID.Contains("Label")) {
string dummy = thiscontrol.ID;
bool IsValid = db.Roles.Any(a => a.controlName == dummy);
if (IsValid == false)
thiscontrol.Visible = false;
}
else if (thiscontrol.ID.Contains("UpdatePanel")) {
foreach (Control UPcontrols in ((UpdatePanel)thiscontrol).ContentTemplateContainer.Controls) {
if (UPcontrols.ID.Contains("TextBox") || UPcontrols.ID.Contains("DropDownList")) {
bool UPIsValid = db.Roles.Any(a => a.controlName == UPcontrols.ID);
if (UPIsValid == false)
UPcontrols.Visible = false;
}
}
}
}
catch { }
}
我的问题在于UPcontrols
!它应该检索UpdatePanel
中的控件,但问题是它不能完成它的工作,除了在调试模式下!
当我添加断点时,一切正常,但是当我运行Web应用程序时,它在UpdatePanel
中找不到任何组件...
答案 0 :(得分:2)
试试这个:
ControlCollection cbb = updatepanel1.Controls;
ControlCollection cb = cbb[0].Controls;
initialize_Controls(cb);
public void initialize_Controls(ControlCollection objcontrls)
{
foreach (Control tb in objcontrls) {
if (tb is TextBox)
((TextBox)tb).Text = "";
if (tb is Panel) {
ControlCollection cbcll = tb.Controls;
foreach (Control tbb in cbcll) {
if (tbb is TextBox)
((TextBox)tbb).Text = "";
}
}
}
}
首先找到来自updatepanel
的控件,ContentTemplate
,然后找到contentTemplate
中包含其中所有控件的控件。
答案 1 :(得分:0)
这似乎是一个非常奇怪的设计。也就是说,为此目的使用控制ID是相当不寻常的。
然而,这里需要一个递归方法来深入了解页面上的每个控件。如果UpdatePanel包含在另一个控件中,则您的方法将不起作用。
答案 2 :(得分:0)