2008-10-24 33 views
5

我想在ASP.NET中创建DropDownList的子类,这样我就可以添加功能并将其用在我的页面中。我试图用UserControl做这件事,但发现它不公开内部DropDownList(我猜是逻辑上)。我已经搜索了答案,但找不到任何东西。在ASP.NET中创建DropDownList的子类

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

任何想法?

+0

你真的需要延长它吗?或者你可以在其中拥有一个DDL的用户控件,然后在用户控件内部挂接各种事件(OnSelectedIndexChanged,OnDataBinding等),以在其中一个事件发生时添加自己的功能?你想添加什么样的附加功能? – 2008-10-24 09:50:47

+0

我想要做的唯一事情就是添加一个InitialValue属性,该属性定义了始终存在于DDL中的第一个值。 – deadtime 2008-10-24 10:01:10

回答

15

您想要在自定义控件中扩展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> 
0

在一个评论,你明确你的目标:“既我想要做的事情是添加一个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来作为其初始值的空白,或者文本,如“选择一个城市”。