2009-07-08 6 views
0

J'essaie d'étendre le contrôle DropDownList pour ajouter simplement une propriété supplémentaire.Ajout d'une propriété supplémentaire à l'asp.net DropDownList

code comme suit

Public Class CustomDropDownList 
    Inherits DropDownList 

    Private key As Int32 

    Public Property PrimaryKey() As Int32 
     Get 
      Return key 
     End Get 
     Set(ByVal value As Int32) 
      key = value 
     End Set 
    End Property 

End Class 

Bien que cela inclut beaucoup de couper/coller à partir d'autres sources, il semble assez simple, j'ai ajouté une variable locale, puis get/déclarations ensemble de la propriété.

Y at-il un problème avec cela? J'ai des problèmes avec le retour de 0 même si j'ai déjà effectué le set avant cela.

bravo! : D

EDIT:

Pour plus de clarté, je suis sur un répéteur avec mon customDropDownList, et dans son cas ItemDataBound, je fais ce qui suit

If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim row As DataRowView = e.Item.DataItem 
     Dim cdlConst As CustomDropDownList = e.Item.FindControl("cdlConstituencies") 
     cdlConst.SelectedValue = row.Item("constituencyrefno") 
     cdlConst.PrimaryKey = row.Item("uniqueid") 
End If 

Mais si j'accéder à la propriété primaryKey à un moment ultérieur, je reçois 0 .. selectedValue et tout le reste fonctionne bien.

Répondre

0

Le problème que vous semblez avoir est lié à viewstate. Votre contrôle n'enregistre pas la valeur de la propriété PrimaryKey dans l'état d'affichage du contrôle et la valeur n'est donc pas conservée entre les publications.

Voici un lien vers un article qui montre comment faire: ViewState and controls

+0

Cela semble intéressant, merci! –

+0

fonctionne un régal! Je t'aime! –

0

Peut-on utiliser le paramètre de valeur de la ListItem lorsque vous ajoutez à la DropDownList

ddlMyDropDown.Items.Add (nouvelle ListItem (obj.Name(), obj.PrimaryKey.ToString()));

Vous regardez juste au SelectedValue pour vous PK

object obj = PrimaryKeyParse(ddlMyDropDown.SelectedValue); 

Désolé, c'est en C#, pas sûr de ce qu'il ressemble pour VB ... me laisser aller vérifier:

ASPX:

<asp:DropDownList ID="ddlMyDropDown" runat="server"> 
    <asp:ListItem Text="-- Select --" Value="0" Selected="True"></asp:ListItem> 
    <asp:ListItem Text="ObjectName 1" Value="PK00001" ></asp:ListItem> 
    <asp:ListItem Text="ObjectName 2" Value="PK00002" ></asp:ListItem> 
</asp:DropDownList> 

HTML:

<select name="ddlMyDropDown" id="ddlMyDropDown"> 
    <option selected="selected" value="0">-- Select --</option> 
    <option value="PK00001">ObjectName 1</option> 
    <option value="PK00002">ObjectName 2</option> 
</select> 
+0

Salut BBV, merci pour votre aide.Je ne suis pas tout à fait sûr de ce que vous obtenez, je n'ai pas changé la façon dont mon ddl gère sa collection d'éléments en aucune façon .. Je viens d'ajouter la propriété supplémentaire. Donc, ce qui précède devrait être identique à n'importe quel dropDownList normal. Je vais ajouter plus d'informations pour plus de clarté. –

+0

Ahhh vous avez besoin d'ajouter cette propriété à l'état de vue de l'objet ... regardez la réponse de Zachary – BigBlondeViking

0

Idéalement, ce que vous devez faire est simplement de lier un objet comme vous le feriez normalement lors de la liaison à une liste, puis lorsque vous voulez que le SelectedItem le transtype comme l'objet auquel il était lié.

Pour l'exemple suivant, supposons que Foo est une classe qui a 2 propriétés ... un PK et un Nom;

MyDropDownList.DataSource = new List { 
    new Foo {PK = 1, Name = "Hello"}, 
    new Foo {PK = 2, Name = "something else"} 
}; 
MyDropDownList.DataTextField = "Name"; 
MyDropDownList.DataValueField = "PK" 
MyDropDownList.DataBind(); 

Maintenant dans certains cas, vous pouvez le faire: Avec l'approche ci-dessus

var theItem = (Foo)MyDropDownList.SelectedItem; 
var mm = theItem.PK; //now you can access your object's properties 

, vous n'avez pas besoin d'étendre un DropDownList mais il suffit d'utiliser les propriétés classe existantes pour obtenir vos données .

+0

Merci pour l'aide, je peux être trompeur certains d'entre vous avec la question et pour cela je m'excuse. Ma liste déroulante est essentiellement une table de recherche avec des paires nom/identifiant. Je l'ai mis en place comme vous l'avez montré. Ma source de données a alors un champ que je veux mettre à jour avec les valeurs de la liste déroulante - c'est la clé primaire de cette source de données que je souhaite stocker aussi dans la liste déroulante - pas sur une base par article mais pour toute la liste la clé primaire pour toutes les mises à jour sur selecteditemchanged .. merci! Je pense que je vais vérifier le problème viewState .. –

Questions connexes