Как сделать цикл для элементов управления в многопользовательских элементах управления? - PullRequest
1 голос
/ 24 июля 2011

Я хочу спросить, могу ли я зациклить свои элементы управления, такие как текстовое поле, раскрывающийся список и т. Д., В которых они находятся в пользовательском элементе управления страницы. Сценарий таков: предположим, у меня есть страница с именем Page.aspx, и у меня есть 3 пользовательских элемента управления в этом page(uc1, uc2 and uc3) и панель 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;
            }

Теперь я не хочу каждый раз писать «1007 *». Могу ли я сделать это рекурсивно?

Спасибо всем большое!

Ответы [ 3 ]

1 голос
/ 24 июля 2011

.NET (насколько мне известно) не поддерживает рекурсивный FindControl, но его можно реализовать самостоятельно.У Стива Смита есть одно: Рекурсивный FindControl

Он имеет дополнительное преимущество использования дженериков, поэтому вы можете сделать что-то вроде:

// uc3 has id = "UserControl1"
TextBox tb = FindControl<TextBox>(UserControl1, "PnlTab1");
if (tb != null)
{ 
    tb.Enabled = true;
}

Посмотрите на его статьюи посмотрим, подходит ли оно вам.

1 голос
/ 24 июля 2011

Вот пример того, как сделать это рекурсивно.

Передайте контейнер для ваших элементов управления (Страница является допустимым элементом управления)

    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);
            }
        }
    }
0 голосов
/ 24 июля 2011

нет необходимости в рекурсии, просто еще один цикл:

   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;
        }
   }
...