我想问一下我是否可以在我的控件中循环,例如文本框,下拉列表等,它们位于页面的用户控件中。方案是,假设我有一个名为'Page.aspx'的页面,我在page(uc1, uc2 and uc3)
中有3个用户控件,并且asp面板(名为PnlTab1)包含每个用户控件中的所有这些控件。
我正在使用该代码来访问我的控件:
UserControl uc1, uc2, uc3;
uc1 = usercontrol1;
uc2 = usercontrol2;
uc3 = usercontrol3;
foreach (Control c in uc1.FindControl("PnlTab1").Controls)
{
if (c is TextBox)
((TextBox)c).Enabled = true;
}
foreach (Control c in uc2.FindControl("PnlTab1").Controls)
{
if (c is TextBox)
((TextBox)c).Enabled = true;
}
foreach (Control c in uc3.FindControl("PnlTab1").Controls)
{
if (c is TextBox)
((TextBox)c).Enabled = true;
}
现在,我不想每次都写'foreach (Control c in uc3.FindControl("PnlTab1").Controls
'。我可以递归地做到吗?
非常感谢你!
答案 0 :(得分:1)
这是一个如何以递归方式执行此操作的示例。
传入控件的容器(Page是一个有效的控件)
public static void DisableAllChildServerControls(Control ctrl, bool disable)
{
foreach(Control c in ctrl.Controls)
{
if (c is TextBox)
{
TextBox t = c as TextBox;
t.Enabled = !disable;
if (t.ID == "txtRefundedAmount")
t.Enabled = true;
}
else if (c is DropDownList)
{
DropDownList d = c as DropDownList;
d.Enabled = !disable;
}
else if (c is Button)
{
Button b = c as Button;
b.Enabled = !disable;
}
if(c.Controls.Count > 0)
{
DisableAllChildServerControls(c, disable);
}
}
}
答案 1 :(得分:1)
.NET不(据我所知)支持递归FindControl,但它可以自己实现。史蒂夫史密斯有一个:Recursive FindControl
它具有使用泛型的额外好处,因此您可以执行以下操作:
// uc3 has id = "UserControl1"
TextBox tb = FindControl<TextBox>(UserControl1, "PnlTab1");
if (tb != null)
{
tb.Enabled = true;
}
看看他的文章,看看它是否符合您的需求。
答案 2 :(得分:0)
不需要递归,只需要另一个循环:
UserControl[] ucs = new UserControl[3]{
usercontrol1,
usercontrol2,
usercontrol3
};
foreach (UserControl uc in ucs){
foreach (Control c in uc.FindControl("PnlTab1").Controls)
{
if (c is TextBox)
((TextBox)c).Enabled = true;
}
}