Cuando se enumera un diccionario, producirá KeyValuePair<TKey,TValue>
objetos ... por lo que solo necesita especificar "Valor" y "Clave" para DataTextField
y DataValueField
, respectivamente, para seleccionar las propiedades Valor / Clave .
Gracias al comentario de Joe, releí la pregunta para resolverlas correctamente. Normalmente, esperaría que la "clave" en el diccionario sea el texto que se muestra y el "valor" sea el valor obtenido. Sin embargo, su código de muestra los usa al revés. A menos que realmente los necesite de esta manera, es posible que desee considerar escribir su código como:
list.Add(cul.DisplayName, cod);
(Y luego cambiar el enlace para usar "Clave" para DataTextField
y "Valor" para DataValueField
, por supuesto).
De hecho, sugiero que, como parece que realmente desea una lista en lugar de un diccionario, es posible que desee reconsiderar el uso de un diccionario en primer lugar. Podrías usar 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));
}
Alternativamente, use una lista de CultureInfo
valores simples . LINQ lo hace realmente fácil:
var cultures = service.LanguagesAvailable()
.Select(language => new CultureInfo(language));
languageList.DataTextField = "DisplayName";
languageList.DataValueField = "Name";
languageList.DataSource = cultures;
languageList.DataBind();
Si no está usando LINQ, aún puede usar un bucle foreach normal:
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();