Lorsqu'un dictionnaire est énuméré, il produira des KeyValuePair<TKey,TValue>objets ... il vous suffit donc de spécifier "Valeur" et "Clé" pour DataTextFieldet DataValueFieldrespectivement, pour sélectionner les propriétés Valeur / Clé .
Grâce au commentaire de Joe, j'ai relu la question pour trouver le bon chemin. Normalement, je m'attendrais à ce que la "clé" dans le dictionnaire soit le texte affiché et la "valeur" soit la valeur extraite. Cependant, votre exemple de code les utilise dans l'autre sens. À moins que vous n'en ayez vraiment besoin, vous voudrez peut-être envisager d'écrire votre code comme suit:
list.Add(cul.DisplayName, cod);
(Et puis en changeant la liaison pour utiliser "Key" pour DataTextFieldet "Value" pour DataValueField, bien sûr.)
En fait, je suggérerais que, comme il semble que vous voulez vraiment une liste plutôt qu'un dictionnaire, vous voudrez peut-être reconsidérer l'utilisation d'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 CultureInfovaleurs simples . LINQ rend cela très simple:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Si vous n'utilisez pas 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();