如何在多用户控件中循环控件?

时间:2011-07-24 08:12:47

标签: c# asp.net user-controls controls foreach

我想问一下我是否可以在我的控件中循环,例如文本框,下拉列表等,它们位于页面的用户控件中。方案是,假设我有一个名为'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'。我可以递归地做到吗?

非常感谢你!

3 个答案:

答案 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;
        }
   }