[c#] C # DropDownList con un diccionario como DataSource


Answers

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

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 ?




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



Related