Quando un dizionario viene enumerato, produrrà KeyValuePair<TKey,TValue>
oggetti ... quindi è sufficiente specificare "Valore" e "Chiave" rispettivamente per DataTextField
e DataValueField
per selezionare le proprietà Valore / Chiave .
Grazie al commento di Joe, ho riletto la domanda per ottenerli nel modo giusto. Normalmente mi aspetto che la "chiave" nel dizionario sia il testo visualizzato e il "valore" sia il valore recuperato. Tuttavia, il codice di esempio li utilizza al contrario. A meno che tu non abbia davvero bisogno che siano in questo modo, potresti prendere in considerazione la possibilità di scrivere il tuo codice come:
list.Add(cul.DisplayName, cod);
(E poi cambiando l'associazione per usare "Chiave" per DataTextField
e "Valore" per DataValueField
, ovviamente.)
In effetti, suggerirei che, poiché sembra che tu voglia davvero un elenco piuttosto che un dizionario, potresti voler riconsiderare l'utilizzo di un dizionario in primo luogo. Potresti semplicemente usare 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));
}
In alternativa, utilizza un elenco di CultureInfo
valori semplici . LINQ lo rende davvero semplice:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Se non stai usando LINQ, puoi comunque usare un normale ciclo foreach:
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();