Веб-элементы управления в UserControl null?

#c# #asp.net #dynamic #user-controls #pageload

#c# #asp.net #динамический #пользовательские элементы управления #загрузка страницы

Вопрос:

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

Вот код:

 public partial class Selector : System.Web.UI.UserControl
{
    public string SelectedValue { get {return this.ddl.SelectedValue; } }
    public int SelectedIndex { get { return this.ddl.SelectedIndex; } }
    public ListItem SelectedItem { get { return this.ddl.SelectedItem; } }
    private string target;
    public string Target { get { return this.target; } set { this.target = value; } }
    protected void Page_Load(object sender, EventArgs e)
    {
        ddl.DataSource = target=="Group"?Util.GetAllGroups(Session["sessionId"].ToString()):Util.GetAllUsers(Session["sessionId"].ToString());
        ddl.DataBind();
    }
}
  

ASP-разметка:

 <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Selector.ascx.cs" Inherits="InspireClient.CustomControls.Selector" %>
<asp:DropDownList runat="server" ID="ddl">
</asp:DropDownList>
  

Если я вставлю свой селектор в aspx-страницу, он будет работать просто отлично.
Пример:

 <SCL:Selector Target="Group" runat="server" />
  

Однако, если я программно добавлю это следующим образом

 ctrl = new Selector();
ctrl.Target = "User";
  

выпадающий список «ddl» равен нулю, и приложение (логически) выдает ошибку. Является ли Page_Load неправильным методом для выполнения такой вещи? Что я делаю не так?

Я должен добавить, что «ctrl» имеет тип dynamic, не уверен, имеет ли это какое-либо отношение к нему.

Заранее спасибо!

Деннис

Ответ №1:

Поскольку вы динамически добавляете пользовательский элемент управления, а не «простой» веб-элемент управления, вам следует использовать метод LoadControl() для его создания:

 protected void Page_Load(object sender, EventArgs e)
{
    Selector yourControl = (Selector) LoadControl("Selector.ascx");
    yourControl.Target = "User";
    Controls.Add(yourControl);
}
  

Комментарии:

1. Спасибо, это работает! В чем именно заключается идея, стоящая за этим, вместо создания экземпляра обычным способом?

2. @Dennis, пользовательские элементы управления на самом деле не могут быть созданы «нормально», потому что разметка, определенная в ascx файле, должна быть динамически обернута в класс, производный от класса, лежащего в основе кода (то же самое происходит для aspx страниц). Создание экземпляра класса, лежащего в основе кода, дает вам только половину поведения элемента управления.

3. Это работает! Для меня вторая строка не применяется. Мои веб-элементы управления в пользовательском элементе управления больше не равны нулю!!! Вот мой (чтобы помочь с шаблоном): contemporitorcontrol, contemporitorcontrol = (contemporitorcontrol) LoadControl(«contemporitorcontrol.ascx»); Элементы управления. Добавить(компенсацияdatacontrol);