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?

¿Fue útil?

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 "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top