2009-04-30 8 views
100

Je veux mettre DataTextField et DataValueField d'un Dropdownlist (languageList) en utilisant un dictionnaire (liste) de languageCod (fr-fr) comme nom de clé et la langue (anglais) comme le texte à afficher.C# DropDownList avec un dictionnaire comme DataSource

pertinentes du Code:

string[] languageCodsList= service.LanguagesAvailable(); 
Dictionary<string, string> list = 
        new Dictionary<string, string>(languageCodsList.Length); 

foreach (string cod in languageCodsList) 
{ 
    CultureInfo cul = new CultureInfo(cod); 
    list.Add(cod, cul.DisplayName); 
} 
languageList.DataSource = list; 
languageList.DataBind(); 

Comment puis-je mettre DataTextField et DataValueField?

Répondre

186

Comme vous pouvez définir DataTextField et DataValueField de DropDownList en utilisant « Key "et "Value" textes:

Dictionary<string, string> list = new Dictionary<string, string>(); 
    list.Add("item 1", "Item 1"); 
    list.Add("item 2", "Item 2"); 
    list.Add("item 3", "Item 3"); 
    list.Add("item 4", "Item 4"); 

    ddl.DataSource = list; 
    ddl.DataTextField = "Value"; 
    ddl.DataValueField = "Key"; 
    ddl.DataBind(); 
+11

Je vous recommande de définir TextField sur "key" et ValueField sur Value. Je pense que c'est plus intuitif. – MGOwen

+14

@MGOwen Il peut être _seem_ intuitif de définir DataValueField à Value, en raison de la "valeur" commune, mais il est en fait illogique dans l'utilisation régulière de la structure de données/contrôle. Pour plus de détails à ce sujet, voir mon commentaire sur la réponse de Jon Skeet. – Dani

+0

Je ne vois pas une liste.Ajoute que cela prend 2 args .. un seul qui prend un arg. est ce winforms ?? – hrh

10

Lorsqu'un dictionnaire est recensée, elle donnera KeyValuePair<TKey,TValue> objets ... alors vous avez juste besoin de préciser « valeur » et « clé » pour respectivement DataTextField et DataValueField, pour sélectionner les Value/Key propriétés.

Grâce au commentaire de Joe, j'ai relu la question pour obtenir les bonnes réponses. Normalement, je m'attendrais à ce que la "clé" du dictionnaire soit le texte affiché et la "valeur" à extraire. Votre exemple de code les utilise cependant dans l'autre sens. À moins que vous avez vraiment besoin d'être de cette façon, vous voudrez peut-être envisager d'écrire votre code comme:

(Et puis en changeant la liaison à utiliser « clé » pour DataTextField et « Value » pour DataValueField, bien sûr.

En fait, je suggère que, comme il semble que vous voulez vraiment une liste plutôt qu'un dictionnaire, vous pourriez vouloir reconsidérer en utilisant un dictionnaire en premier lieu. Vous pouvez simplement utiliser un List<KeyValuePair<string, string>>:

string[] languageCodsList = service.LanguagesAvailable(); 
var list = new List<KeyValuePair<string, string>>(); 

foreach (string cod in languageCodsList) 
{ 
    CultureInfo cul = new CultureInfo(cod); 
    list.Add(new KeyValuePair<string, string>(cul.DisplayName, cod)); 
} 

Vous pouvez également utiliser une liste de valeurs CultureInfo simples. LINQ fait vraiment facilement:

var cultures = service.LanguagesAvailable() 
         .Select(language => new CultureInfo(language)); 
languageList.DataTextField = "DisplayName"; 
languageList.DataValueField = "Name"; 
languageList.DataSource = cultures; 
languageList.DataBind(); 

Si vous ne l'utilisez LINQ, vous pouvez toujours utiliser une boucle foreach normale:

List<CultureInfo> cultures = new List<CultureInfo>(); 
foreach (string cod in service.LanguagesAvailable()) 
{ 
    cultures.Add(new CultureInfo(cod)); 
} 
languageList.DataTextField = "DisplayName"; 
languageList.DataValueField = "Name"; 
languageList.DataSource = cultures; 
languageList.DataBind(); 
+3

En fait, ce qui est faux - voir mon commentaire sur la réponse acceptée. –

+0

Ah, j'aurais mal lu la question. Il me semble déroutant de les mettre dans un dictionnaire «à l'envers». Éditera ma réponse. –

+1

@JonSkeet La raison de l'association "vers l'arrière" est que les données stockées dans le dictionnaire comme paire clé/valeur utilisent normalement la clé (valeur de recherche) comme association de données (par exemple pour le référencement de la base de données) et dans une liste déroulante liste, cela correspond à DataValueField, c'est-à-dire ** la valeur de retour ** d'un POST, qui vous en dit plus sur l'élément sélectionné que le DataTextField, c'est-à-direla valeur d'affichage. (DropDownLists a juste une mauvaise convention de nommage) – Dani

6

utiliser "Key" et "Value"

+6

Quelqu'un l'a déjà dit. Mais bon essai! Bienvenue à SO :) – scraimer

5

Si le DropDownList est DECLAR ed dans votre page aspx et non dans le codebehind, vous pouvez le faire comme ça.

.aspx:

<asp:DropDownList ID="ddlStatus" runat="server" DataSource="<%# Statuses %>" 
    DataValueField="Key" DataTextField="Value"></asp:DropDownList> 

.aspx.cs:

protected void Page_Load(object sender, EventArgs e) 
{ 
    ddlStatus.DataBind(); 
    // or use Page.DataBind() to bind everything 
} 

public Dictionary<int, string> Statuses 
{ 
    get 
    { 
     // do database/webservice lookup here to populate Dictionary 
    } 
}; 
+0

Matt sûr que cela va fonctionner? –

+0

Fonctionne parfaitement bien! – Druid

+0

Refusée. Il est à noter qu'il est OBLIGATOIRE que ce soit un objet côté serveur à évaluer. Vous ne pouvez pas le transmettre en ligne en utilisant <%# syntax %>. Que ce soit un