Вопрос

Я хочу создать подкласс встроенного DropDownList в ASP.NET, чтобы я мог добавить к нему функциональность и использовать его на своих страницах. Я попытался сделать это с UserControl, но обнаружил, что он не раскрывает внутренний DropDownList (логично, я думаю). Я гуглил ответ, но ничего не могу найти.

Я дошел до написания фактического класса, и можно создать подкласс из DropDownList, но я не могу зарегистрировать файл на моей странице ASP.NET и использовать его в представлении исходного кода. Может быть, мне не хватает некоторых свойств в моем классе?

Есть идеи?

Это было полезно?

Решение

Вы хотите расширить 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's

<my:MyDropDownList ID="myDDl" runat="server">
    ...
</my:MyDropDownList>

Другие советы

В комментарии вы уточняете свою цель: " единственное, что я хочу с ним сделать, - это добавить свойство 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 имел в качестве начального значения пустое значение или текст, такой как "Выберите город".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top