Получите контроль отражением - PullRequest
3 голосов
/ 14 мая 2011

Мне нужно получить элемент управления [текстовое поле, метку, кнопку ... и т. Д.] Со своей страницы по его идентификатору, используя отражение

В моем случае у меня есть класс, который наследуется от него всеми остальными системными страницами, и этот класс переопределяет событие onload, чтобы изменить некоторые свойства для некоторых элементов управления

как установить состояние видимости для текстового поля по его имени, но так как у меня нет прямого элемента управления на странице, так как он может быть у меня в заполнителе содержимого на главной странице, поэтому я не могу использовать метод findcontrol, и я думаю, что рекурсивно функция поиска элемента управления займет слишком много времени

Итак Я пытаюсь сделать это с помощью рефлексии, чтобы найти элемент управления с его именем , затем изменить видимое или включить состояние для него

Я использовал класс FieldInfo, но со мной не работает

FieldInfo fi = this.GetType().GetField("ControlID", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);

Любая помощь!

Ответы [ 3 ]

7 голосов
/ 14 мая 2011

Вы пробовали FindControl

  Control myControl = this.FindControl("TextBox2");
  if(myControl !=null)
  {
       // Do Stuff
  }
1 голос
/ 14 мая 2011

может быть, вам нужно рекурсивно найти ваш элемент управления с помощью FindControl, а затем вызвать себя?

private static Control FindNestedControl(string id, Control parent)
{
    Control item = parent.FindControl(id);

    if(item == null) 
    {
        foreach(var child in parent.Controls)
        {
            item = child.FindNestedControl(id, child);

            if(item != null)
            {
                return item;
            }
        }
    }

    return null;
}

И вызвать его, передав текущий экземпляр страницы через:

Control item = FindNestedControl("bob", this);

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

Другим способом сделать это было бы просто представить элементы управления в качестве свойств вашего базового класса:

public abstract class BasePage : Page
{
    #region Properties

    /// Gets the textbox for editing in derived classes.
    protected TextBox SomeTextBox
    {
       return this.textBox; }
    }

    #endregion

}

И последний способ сделать это - подключиться к производным классам в вашем базовом классе:

public abstract class BasePage : Page
{
        /// <summary>
        /// Called when loading the page.
        /// </summary>
        /// <param name="e">The event arguments.</param>
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            // Do some basic setup.

            // Now pass the controls to the derived classes.
            this.ConfigureControl(this.mainText);
            this.ConfigureControl(this.nameDropDown);
            this.ConfigureControl(this.someOtherControl);            
        }

        /// <summary>
        /// Provides hook for derived classes.
        /// </summary>
        /// <param name="control">The core control.</param>
        protected virtual void ConfigureControl(Control control)
        {
        }
 }

А затем переопределить на вашей производной странице:

protected override void ConfigureControl(Control control)
{
    switch(control.ID) 
    {
        case "mainText":
        TextBox mainText = (TextBox)control;
        mainText.Text = "works";
        break;
    }
}

Из них я, вероятно, использовал бы второе, если бы не так много элементов управления. Первый способ полезен при работе с ретрансляторами и т. П.

0 голосов
/ 14 мая 2011

Вот очень полезный метод расширения для рекурсивного получения дочерних элементов управления:

public static IEnumerable<Control> GetChildControls(this Control control)
{
    var children = (control.Controls != null) ? control.Controls.OfType<Control>() : Enumerable.Empty<Control>();
    return children.SelectMany(c => GetChildControls(c)).Concat(children);
}

Использование:

IEnumerable<Control> allChildren = parent.GetChildControls();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...