C# DropDownList con un diccionario como fuente de datos
-
03-07-2019 - |
Pregunta
quiero establecer DataTextField
y DataValueField
de un Dropdownlist
(languageList) usando un diccionario (lista) de languageCod
(en-gb) como clave y nombre del idioma (inglés) como texto a mostrar.
Código relevante:
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();
¿Cómo puedo configurar DataTextField
y DataValueField
?
Solución
De esta manera, puede establecer DataTextField y DataValueField de DropDownList usando " Key " y " Valor " textos:
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();
Otros consejos
Cuando se enumera un diccionario, producirá KeyValuePair<TKey,TValue>
objetos...por lo que sólo necesita especificar "Valor" y "Clave" para DataTextField
y DataValueField
respectivamente, para seleccionar el Valor/Llave propiedades.
Gracias al comentario de Joe, releí la pregunta para entenderlas 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 necesites que sean de esta manera, quizás quieras considerar escribir tu 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, sugeriría que, como parece que realmente quieres un lista En lugar de un diccionario, es posible que desees reconsiderar el uso de un diccionario en primer lugar.Podrías usar simplemente 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 simples CultureInfo
valores.LINQ hace esto 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ás usando LINQ, aún puedes 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();
Si el DropDownList se declara en su página aspx y no en el código subyacente, puede hacerlo así.
.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
}
};
Solo use " Tecla " y " Valor "