我想子类化 ASP.NET 中的内置 DropDownList,以便我可以向它添加功能并在我的页面中使用它。我尝试使用 UserControl 执行此操作,但发现它没有公开内部 DropDownList(我猜从逻辑上讲)。我已经用谷歌搜索了答案,但找不到任何东西。
我已经编写了实际的类,并且可以从 DropDownList 子类化,但我无法在我的 ASP.NET 页面中注册该文件并在源视图中使用它。也许我在课堂上缺少一些属性?
有任何想法吗?
我想子类化 ASP.NET 中的内置 DropDownList,以便我可以向它添加功能并在我的页面中使用它。我尝试使用 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 应用程序中添加对它的引用。
以及您的 web.config 中的 tagprefix
<add tagPrefix="my" namespace="My.Namespace.Controls" assembly="MyLibrary" />
这应该允许您将其添加到您的 aspx/ascx
<my:MyDropDownList ID="myDDl" runat="server">
...
</my:MyDropDownList>
在评论中,您阐明了您的目标:“我唯一想做的就是添加一个 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 的初始值都为空白,或者诸如“选择城市”之类的文本。