Drop down menu 带有自动填充项的自定义下拉列表

Drop down menu 带有自动填充项的自定义下拉列表,drop-down-menu,asp.net-2.0,custom-server-controls,Drop Down Menu,Asp.net 2.0,Custom Server Controls,我需要一个包含美国各州的下拉列表。我可能需要这个下拉列表在不同的页面。我想要一个简单的控件,而不是总是为每个状态创建一个listitem。我不想要UserControl—我想要扩展现有的dropdownlist控件。我知道我以前在一个雇主做过这件事,但我一辈子都不记得怎么做了 我不能对每个州都这样做吗?如果是,在哪里 MyBase.Items.Add(New ListItem("Illinois","IL")) 有什么想法吗 谢谢您只需创建一个新类并从相应的控件继承即可: /// <su

我需要一个包含美国各州的下拉列表。我可能需要这个下拉列表在不同的页面。我想要一个简单的控件,而不是总是为每个状态创建一个listitem。我不想要UserControl—我想要扩展现有的dropdownlist控件。我知道我以前在一个雇主做过这件事,但我一辈子都不记得怎么做了

我不能对每个州都这样做吗?如果是,在哪里

MyBase.Items.Add(New ListItem("Illinois","IL"))
有什么想法吗


谢谢

您只需创建一个新类并从相应的控件继承即可:

/// <summary>
/// </summary>
[DefaultProperty("DataTable"),
     ToolboxData("<{0}:ExtendedDropDownlist runat=server></{0}:ExtendedDropDownlist>")]
public class ExtendedDropDownList : DropDownList


    /// <summary>
    /// Render this control to the output 
    /// parameter specified.
    /// </summary>
    /// <param name="output"> The HTML writer to 
    /// write out to </param>
    protected override void Render(HtmlTextWriter output)
    {
        //output.Write(Text);
        base.Render(output);
    }
//
/// 
[默认属性(“数据表”),
ToolboxData(“”)
公共类ExtendedDropDownList:DropDownList
/// 
///将此控件呈现到输出
///指定的参数。
/// 
///HTML编写器
///写信给
受保护的覆盖无效渲染(HtmlTextWriter输出)
{
//输出。写入(文本);
base.Render(输出);
}
在构造函数中,只需添加适当的列表框项即可


您可能需要将其放在不同的项目中并引用dll。我想我还记得一些事情,但我已经有一段时间没有这么做了。

扩展DropDownList控件并覆盖OnLoad事件,然后像这样添加您的项目:

protected override void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        this.Items.Add(new ListItem("Illinois","IL"));
    }
}
_
公共类StateDropDownList
继承DropDownList
受保护的覆盖子渲染内容(ByVal输出为HtmlTextWriter)
输出.写入(文本)
端接头
受保护的覆盖子RenderChildren(ByVal编写器作为System.Web.UI.HtmlTextWriter)
MyBase.RenderChildren(编写器)
端接头
专用子加载状态()
MyBase.Items.Add(新列表项(“阿拉巴马”、“AL”))
'为大小删除了其他状态
MyBase.Items.Add(新列表项(“怀俄明州”、“怀俄明州”))
端接头
公共分新()
“这不管用
'加载状态()
端接头
私有子状态dropdownlist_Init(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Init
“这不管用
'加载状态()
端接头
私有子状态dropdownlist_Load(ByVal sender作为对象,ByVal e作为System.EventArgs)处理Me.Load
“这不管用
'如果不是Page.IsPostBack,则
'加载状态()
"完"
端接头
受保护的覆盖子呈现(ByVal编写器作为System.Web.UI.HtmlTextWriter)
MyBase.Render(编写器)
端接头
末级

尝试将其放在其他项目中并引用dll。您可能还需要添加渲染覆盖。我发现我知道的代码是有效的,这可能就是诀窍。没关系,我不这么认为。我认为这样做没有道理。你能把你的代码贴出来让我们看看吗?我试过了,我得到的只是一个空的下拉列表,但在源代码视图中我得到了这样的结果:我一点都不知道VB.net,但这可能与在项目上使用MyBase有关,或者与渲染有关吗?Kevin,我刚刚用我替换了MyBase(VB的这个等价物),还有同样的事情。。。
<ToolboxData("<{0}:StateDropDownList runat=server></{0}:StateDropDownList>")> _
Public Class StateDropDownList
    Inherits DropDownList

    Protected Overrides Sub RenderContents(ByVal output As HtmlTextWriter)
        output.Write(Text)
    End Sub

    Protected Overrides Sub RenderChildren(ByVal writer As System.Web.UI.HtmlTextWriter)
        MyBase.RenderChildren(writer)
    End Sub


    Private Sub LoadStates()
        MyBase.Items.Add(New ListItem("Alabama", "AL"))
        'Additional states removed for size
        MyBase.Items.Add(New ListItem("Wyoming", "WY"))
    End Sub

    Public Sub New()
        'tried does not work
        ' LoadStates()
    End Sub

    Private Sub StateDropDownList_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
        'tried does not work
        ' LoadStates()
    End Sub


    Private Sub StateDropDownList_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'tried does not work
        'If Not Page.IsPostBack Then
        '    LoadStates()
        'End If
    End Sub

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        MyBase.Render(writer)
    End Sub
End Class
public class DropDownListStates : System.Web.UI.WebControls.DropDownList
{
    protected override void CreateChildControls()
    {
        if (Items.Count > 0) return;

        Items.Add(new System.Web.UI.WebControls.ListItem("AL"));

        // other states here...

        Items.Add(new System.Web.UI.WebControls.ListItem("WY"));

    }
}