在ASP.NET中创建DropDownList的子类
问题描述:
我想在ASP.NET中创建DropDownList的子类,这样我就可以添加功能并将其用在我的页面中。我试图用UserControl做这件事,但发现它不公开内部DropDownList(我猜是逻辑上)。我已经搜索了答案,但找不到任何东西。在ASP.NET中创建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中的第一个值。“
我不认为你需要创建一个特殊的用户控件或自定义控件来完成。
我经常在我的网络应用程序中使用此代码来填充列表控件。您传递一个布尔值,指示是否要在列表顶部添加一个额外的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等),以在其中一个事件发生时添加自己的功能?你想添加什么样的附加功能? – 2008-10-24 09:50:47
我想要做的唯一事情就是添加一个InitialValue属性,该属性定义了始终存在于DDL中的第一个值。 – deadtime 2008-10-24 10:01:10