Подтвердить что ты не робот

Найти элемент управления в веб-форме

У меня есть форма веб-контента и вам нужно получить доступ к элементу управления внутри панели содержимого. Я знаю два способа доступа к элементу управления:

  • TextBox txt = (TextBox)Page.Controls[0].Controls[3].Controls[48].Controls[6]
  • Записывая рекурсивную функцию, которая просматривает все элементы управления.

Есть ли другой простой способ, так как Page.FindControl не работает в этом экземпляре. Причина, по которой я спрашиваю, это то, что мне кажется, что объект страницы или объект Content Panel должны иметь метод для поиска дочернего элемента управления, но не могут найти что-либо подобное.

4b9b3361

Ответ 1

Проблема заключается в том, что FindControl() не пересекает определенные дочерние элементы управления, такие как шаблонный элемент управления. Если элемент управления, который вы используете после жизни в шаблоне, он не будет найден.

Итак, мы применили следующие методы расширения. Если вы не используете 3.5 или хотите избежать методов расширения, вы можете сделать из них общую библиотеку.

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

var button = Page.GetControl("MyButton") as Button;

Методы расширения выполняют рекурсивную работу для вас. Надеюсь, это поможет!

public static IEnumerable<Control> Flatten(this ControlCollection controls)
{
    List<Control> list = new List<Control>();
    controls.Traverse(c => list.Add(c));
    return list;
}

public static IEnumerable<Control> Flatten(this ControlCollection controls,     
    Func<Control, bool> predicate)
{
    List<Control> list = new List<Control>();
    controls.Traverse(c => { if (predicate(c)) list.Add(c); });
    return list;
}

public static void Traverse(this ControlCollection controls, Action<Control> action)
{
    foreach (Control control in controls)
    {
        action(control);
        if (control.HasControls())
        {
            control.Controls.Traverse(action);
        }
    }
}

public static Control GetControl(this Control control, string id)
{
    return control.Controls.Flatten(c => c.ID == id).SingleOrDefault();
}

public static IEnumerable<Control> GetControls(this Control control)
{
    return control.Controls.Flatten();
}

Ответ 2

Я хотел бы изменить вашу функцию GetControls на общий, как показано ниже:

public static T GetControl<T>(this Control control, string id) where T:Control
{
    var result = control.Controls.Flatten(c => (c.GetType().IsSubclassOf(typeof(T))) && (c.ID == id)).SingleOrDefault();
    if (result == null)
        return null;
    return result as T;
}

И Затем

public static Control GetControl(this Control control, string id)
{
    return control.GetControl<Control>(id);
}

Таким образом, вызывающий абонент вызовет что-то вроде:

var button = Page.GetControl<Button>("MyButton");