#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);