С помощью каких методов можно динамически установить свойство элемента управления ASPX перед его инициализацией? - PullRequest
2 голосов
/ 19 мая 2010

Мне нужно настроить свойство пользовательского элемента управления, который я написал, в частности, перед тем, как элемент управления вызовет OnInit. Если я присваиваю его как часть файла ASPX, он, естественно, работает, но если я вместо этого перенесу присваивание в другие части кода, он выдаст ошибку из-за пустого и недопустимого значения. Ниже показано, как это выглядит при работе на странице ASPX.

<MyCustomControls:SingleCascadeLookupMulti FilterString="Seventh" FilterByStatus="true" ControlMode="New" FieldName="Speciality" EnableViewState="true" ID="sclmDocuments" runat="server" TemplateName="SingleCascadeLookupMulti" />

Это свойство FilterString, представляющее собой простую строку. Следует также отметить, что свойство FieldName (унаследованное от базового класса элемента управления "BaseFieldControl") также будет выдавать ошибку, если оно не инициализировано, но если я установлю FieldName в коде, стоящем за методом OnInit, это работает правильно. FilterString не так, на самом деле он не будет назначен. Итак, я знаю, что некоторые методы для определенных свойств будут работать для установки значения свойства, но это не всегда будет работать. Я также попытался поместить его в OnPreInit, но безрезультатно.

Я использую подход динамического назначения, потому что функциональность этой страницы должна быть реплицирована для ряда различных списков, а свойства FilterString и FieldName будут отличаться в каждом случае. Вместо того, чтобы писать полдюжины практически одинаковых aspx-страниц с одинаковым кодом, но отличающимися только тем, что представляют собой эти два свойства, я подумал, что было бы разумнее использовать строку запроса страницы и некоторые производные параметры для динамической установки этих свойств. Как таковые, какие методы доступны для выполнения этой задачи?

1 Ответ

1 голос
/ 19 мая 2010

Один из методов, которые я использовал для этого, - создать конструктор в элементе управления, который принимает параметры, которые мне нужно установить (в вашем случае FilterString). Затем я использую следующую функцию для динамической загрузки элемента управления, передавая ему параметры:

protected UserControl LoadControl(string UserControlPath, params object[] constructorParameters)
{
    List<System.Type> constParamTypes = new List<System.Type>();
    foreach (object constParam in constructorParameters)
    {
        constParamTypes.Add(constParam.GetType());
    }

    UserControl ctl = Page.LoadControl(UserControlPath) as UserControl;

    // Find the relevant constructor
    ConstructorInfo constructor = ctl.GetType().BaseType.GetConstructor(constParamTypes.ToArray());

    //And then call the relevant constructor


      if (constructor == null)
        {
            throw new MemberAccessException("The requested constructor was not found on : " + ctl.GetType().BaseType.ToString());
        }
        else
        {
            constructor.Invoke(ctl, constructorParameters);
        }

        // Finally return the fully initialized UC
        return ctl;
    }

и вызовите метод следующим образом:

Control ctlToAdd = this.LoadControl("UserControls/MyControl.ascx", Parameter1, "Parameter2");
        MyDiv.Controls.Add(ctlToAdd);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...