c# - C # DropDownList con un diccionario como DataSource





dictionary drop-down-menu (5)


Solo usa "Clave" y "Valor"

Quiero establecer DataTextField y DataValueField de una lista Dropdownlist (languageList) usando un diccionario (lista) de languageCod (en-gb) como clave y el nombre del idioma (inglés) como el texto para 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 ?




Cuando se enumera un diccionario, generará KeyValuePair<TKey,TValue> objetos ... por lo que solo debe especificar "Value" y "Key" para DataTextField y DataValueField , respectivamente, para seleccionar las propiedades Value / Key .

Gracias al comentario de Joe, volví a leer la pregunta para que todo salga bien. 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, puede 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. Solo podría 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 valores simples de CultureInfo . 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á utilizando LINQ, aún puede usar un ciclo 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();



Así puedes establecer DataTextField y DataValueField de DropDownList usando textos "Clave" y "Valor":

    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();



Si 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
    }
};



Iterar sobre un dict itera a través de sus claves sin ningún orden en particular, como puede ver aquí:

Edición: (Este ya no es el caso en Python3.6 , pero tenga en cuenta que aún no se garantiza el comportamiento)

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

Para su ejemplo, es una mejor idea usar dict.items() :

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

Esto le da una lista de tuplas. Cuando los recorres de esta manera, cada tupla se desempaqueta en k y v automáticamente:

for k,v in d.items():
    print(k, 'corresponds to', v)

Usar k y v como nombres de variables cuando se repite en un dict es bastante común si el cuerpo del bucle es solo de unas pocas líneas. Para bucles más complicados, puede ser una buena idea usar nombres más descriptivos:

for letter, number in d.items():
    print(letter, 'corresponds to', number)

Es una buena idea acostumbrarse a usar cadenas de formato:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))




c# dictionary drop-down-menu