2008-10-24 5 views
5

Je veux sous-classer DropDownList intégré dans ASP.NET afin que je puisse ajouter des fonctionnalités et l'utiliser dans mes pages. J'ai essayé de le faire avec un UserControl mais j'ai trouvé qu'il n'expose pas le DropDownList interne (logiquement, je suppose). J'ai googlé pour la réponse mais je ne trouve rien. Je suis venu jusqu'à écrire la classe actuelle, et il est possible de sous-classer à partir de DropDownList mais je suis incapable d'enregistrer le fichier dans ma page ASP.NET et de l'utiliser dans la vue source. Peut-être que je manque des propriétés dans ma classe?Sous-classement DropDownList dans ASP.NET

Des idées?

+0

Avez-vous vraiment besoin de l'étendre? ou pouvez-vous simplement avoir un contrôle d'utilisateur avec le DDL et ensuite raccorder les divers événements (OnSelectedIndexChanged, OnDataBinding etc) à l'intérieur de votre contrôle utilisateur pour ajouter votre propre fonctionnalité quand l'un de ces événements se produit? Quel genre de fonctionnalités supplémentaires essayez-vous d'ajouter? –

+0

La seule chose que je veux faire avec c'est ajouter une propriété InitialValue qui définit la première valeur qui est toujours présente dans le DDL. – deadtime

+0

Serait-il judicieux d'exposer le DDL comme innerDropDownList ou quelque chose? – deadtime

Répondre

15

Vous souhaitez étendre DropDownList dans un contrôle personnalisé ... et non dans un contrôle utilisateur.

Créez un nouveau projet de bibliothèque de classes appelé MyLibrary.

Ajouter une classe appelée 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 
    } 
} 
} 

Une fois que vous compilez votre bibliothèque, vous pouvez ajouter une référence dans votre application web.

Et tagprefix dans votre web.config

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

Cela devrait vous permettre d'ajouter ceci à votre ASPX/ascx de

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

+1 Voici une excellente description de la façon de créer des contrôles personnalisés héritant de leurs fonctionnalités à partir des objets ASP.NET de base. Très clair et concis! – kdmurray

0

Dans un commentaire, vous clarifiez votre objectif: « La seule Ce que je veux faire avec, c'est ajouter une propriété InitialValue qui définit la première valeur toujours présente dans le DDL. "

Je ne pense pas que vous ayez besoin de créer un contrôle utilisateur spécial ou un contrôle personnalisé pour y parvenir.

J'utilise souvent ce code dans mes applications Web pour remplir les contrôles de la liste. Vous passez un booléen indiquant si un élément ListItem supplémentaire doit être ajouté en haut de la liste et le texte de cet élément.

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

Ceci est utile, par exemple, si vous voulez que chaque DropDownList d'avoir comme valeur initiale d'un vide ou texte tel que « Sélectionnez une ville ».

Questions connexes