Я хочу создать подкласс от встроенного DropDownList в ASP.NET, чтобы я мог добавлять к нему функциональные возможности и использовать его на своих страницах. Я попытался сделать это с помощью UserControl, но обнаружил, что он не отображает внутренний DropDownList (логически, я думаю). Я искал ответ в Google, но ничего не нашел.
Я дошел до написания фактического класса, и можно создать подкласс от DropDownList, но я не могу зарегистрировать файл на своей странице ASP.NET и использовать его в исходном представлении. Может быть, мне не хватает каких-то свойств в моем классе?
Есть идеи?
Единственное, что я хочу с этим сделать, - это добавить свойство InitialValue, которое определяет первое значение, которое всегда присутствует в DDL.
Было бы разумно просто выставить DDL как innerDropDownList или что-то в этом роде?
Не могли бы вы использовать ddlxxx.Items.Insert (); где-то в пользовательском элементе управления может быть сразу после привязки к вашему источнику данных?
Другой вариант - взять исходный источник и создать новый источник (коллекцию или что-то еще), который включает первое значение и исходные данные, а затем выполнить привязку к вашему новому составному источнику.





Вы хотите расширить DropDownList в пользовательском элементе управления ... не в пользовательском элементе управления.
Создайте новый проект библиотеки классов под названием MyLibrary.
Добавьте класс MyDropDownList.cs
namespace My.Namespace.Controls
{
[ToolboxData("<{0}:MyDropDownList runat=\"server\"></{0}:MyDropDownList>")]
public class MyDropDownList: DropDownList
{
// your custom code goes here
// e.g.
protected override void RenderContents(HtmlTextWriter writer)
{
//Your own render code
}
}
}
Скомпилировав свою библиотеку, вы можете добавить ссылку на нее в своем веб-приложении.
И префикс тега в вашем web.config
<add tagPrefix = "my" namespace = "My.Namespace.Controls" assembly = "MyLibrary" />
Это должно позволить вам добавить это в свой aspx / ascx
<my:MyDropDownList ID = "myDDl" runat = "server">
...
</my:MyDropDownList>
+1 Это отличное описание того, как создавать настраиваемые элементы управления, которые наследуют свою функциональность от базовых объектов ASP.NET. Очень четко и лаконично!
В комментарии вы поясняете свою цель: «Единственное, что я хочу с этим сделать, это добавить свойство InitialValue, которое определяет первое значение, которое всегда присутствует в DDL».
Я не думаю, что вам нужно создавать специальный пользовательский элемент управления или настраиваемый элемент управления для этого.
Я часто использую этот код в своих веб-приложениях для заполнения элементов управления списками. Вы передаете логическое значение, указывающее, следует ли добавить дополнительный ListItem в верхнюю часть списка, и текст для этого элемента.
public static void BindListControl (ListControl ctl, SqlDataReader dr,
String textColumn, String valueColumn, bool addBlankRow, string blankRowText)
{
ctl.Items.Clear();
ctl.DataSource = dr;
ctl.DataTextField = textColumn;
ctl.DataValueField = valueColumn;
ctl.DataBind();
if (addBlankRow == true) ctl.Items.Insert(0, blankRowText);
}
Это полезно, например, если вы хотите, чтобы каждый DropDownList имел в качестве начального значения пустое поле или текст, например «Выберите город».
Вам действительно нужно его продлить? или вы можете просто иметь пользовательский элемент управления с DDL в нем, а затем подключать различные события (OnSelectedIndexChanged, OnDataBinding и т. д.) внутри вашего пользовательского элемента управления, чтобы добавить свои собственные функции, когда происходит одно из этих событий? Какие дополнительные функции вы пытаетесь добавить?