5

我想子类化 ASP.NET 中的内置 DropDownList,以便我可以向它添加功能并在我的页面中使用它。我尝试使用 UserControl 执行此操作,但发现它没有公开内部 DropDownList(我猜从逻辑上讲)。我已经用谷歌搜索了答案,但找不到任何东西。

我已经编写了实际的类,并且可以从 DropDownList 子类化,但我无法在我的 ASP.NET 页面中注册该文件并在源视图中使用它。也许我在课堂上缺少一些属性?

有任何想法吗?

4

2 回答 2

16

您想在自定义控件中扩展 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 应用程序中添加对它的引用。

以及您的 web.config 中的 tagprefix

    <add tagPrefix="my" namespace="My.Namespace.Controls" assembly="MyLibrary" />

这应该允许您将其添加到您的 aspx/ascx

<my:MyDropDownList ID="myDDl" runat="server">
    ...
</my:MyDropDownList>
于 2008-10-24T10:02:22.003 回答
1

在评论中,您阐明了您的目标:“我唯一想做的就是添加一个 InitialValue 属性,该属性定义 DDL 中始终存在的第一个值。”

我认为您不需要创建特殊的用户控件或自定义控件来完成此操作。

我经常在我的 Web 应用程序中使用此代码来填充列表控件。您传入一个布尔值,指示是否要在列表顶部添加一个额外的 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 的初始值都为空白,或者诸如“选择城市”之类的文本。

于 2008-10-24T13:02:17.807 回答