2008-10-24 6 views
5

Ich möchte die integrierte DropDownList in ASP.NET ableiten, damit ich Funktionalität hinzufügen und auf meinen Seiten verwenden kann. Ich habe versucht, dies mit einem UserControl zu tun, aber festgestellt, dass es die interne DropDownList nicht verfügbar macht (logisch, denke ich). Ich habe nach der Antwort gegoogelt, kann aber nichts finden.Subclassing DropDownList in ASP.NET

Ich bin soweit gekommen, die eigentliche Klasse zu schreiben, und es ist möglich, eine Unterklasse von DropDownList zu erstellen, aber ich kann die Datei nicht auf meiner ASP.NET-Seite registrieren und in der Quellansicht verwenden. Vielleicht fehlen mir einige Eigenschaften in meiner Klasse?

Irgendwelche Ideen?

+0

Müssen Sie es wirklich erweitern? Oder können Sie einfach ein Benutzersteuerelement mit der DDL darin haben und dann die verschiedenen Ereignisse (OnSelectedIndexChanged, OnDataBinding usw.) in Ihrem Benutzersteuerelement anschließen, um Ihre eigenen Funktionen hinzuzufügen, wenn eines dieser Ereignisse eintritt? Welche Art von zusätzlicher Funktionalität möchten Sie hinzufügen? –

+0

Das einzige, was ich damit machen möchte, ist eine Eigenschaft InitialValue hinzuzufügen, die den ersten Wert definiert, der immer in der DDL vorhanden ist. – deadtime

+0

Wäre es sinnvoll, die DDL nur als innerDropDownList oder sowas auszusetzen? – deadtime

Antwort

15

Sie möchten DropDownList in einem benutzerdefinierten Steuerelement ... nicht in einem Benutzersteuerelement erweitern.

Erstellen Sie ein neues Klassenbibliotheksprojekt namens MyLibrary.

eine Klasse namens 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 
    } 
} 
} 

hinzufügen Nachdem Sie Ihre Bibliothek kompilieren, Sie einen Verweis auf sie in Ihre Web-Anwendung hinzufügen können.

Und ein TagPrefix in Ihrem web.config

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

, mit denen sollten Sie dies zu Ihrer aspx/ascx der

<my:MyDropDownList ID="myDDl" runat="server"> 
    ... 
</my:MyDropDownList> 
+1

+1 Dies ist eine großartige Beschreibung zum Erstellen von benutzerdefinierten Steuerelementen, die ihre Funktionalität von den ASP.NET-Basisobjekten erben. Sehr klar und prägnant! – kdmurray

0

In einem Kommentar hinzufügen, können Sie Ihr Ziel klären: „Die einzigen Ich möchte damit eine InitialValue-Eigenschaft hinzufügen, die den ersten Wert definiert, der immer in der DDL vorhanden ist. "

Ich glaube nicht, dass Sie ein spezielles Benutzersteuerelement oder benutzerdefinierte Steuerelement erstellen müssen, um dies zu erreichen.

Ich verwende diesen Code häufig in meinen Web-Apps, um Listensteuerelemente aufzufüllen. Sie übergeben einen booleschen Wert, der angibt, ob ein zusätzliches ListItem am Anfang der Liste hinzugefügt werden soll, und den Text für dieses Element.

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); 
    } 

Dies ist zum Beispiel nützlich, wenn Sie jede Dropdownlist haben, als ihren Anfangswert eines leeren oder Text wie „Wählen Sie eine Stadt“ wollen.