2009-04-30 15 views
100

Quiero establecer DataTextField y DataValueField de un (languageList) Dropdownlist usando un diccionario (lista) de languageCod (es-ES) como la clave y nombre del idioma (Inglés) como el texto que se vea.C# DropDownList con un diccionario como fuente de datos

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 establecer DataTextField y DataValueField?

Respuesta

186

Al igual que se puede establecer DataTextField y DataValueField de DropDownList utilizando "Clave "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(); 
+11

Recomendaría establecer TextField en "clave" y ValueField en Value. Creo que eso es más intuitivo. – MGOwen

+14

@MGOwen Puede parecerle intuitivo establecer DataValueField en Valor, debido al "Valor" común, pero en realidad es ilógico en el uso regular de la estructura de datos/control. Para detalles sobre esto, vea mi comentario sobre la respuesta de Jon Skeet. – Dani

+0

No veo una lista.Agregar eso toma 2 argumentos ... solo uno que toma una arg. es esto winforms? – hrh

10

Cuando un diccionario se enumera, se rendirá KeyValuePair<TKey,TValue> objetos ... por lo que sólo tiene que especificar "Valor" y "clave" para DataTextField y DataValueField respectivamente, para seleccionar los Value/Key propiedades.

Gracias al comentario de Joe, volví a leer la pregunta para obtener estos en el camino correcto. 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 necesita a ser de esta manera, es posible que desee considerar la posibilidad de escribir el código como:

(Y entonces el cambio de la unión a utilizar "clave" para DataTextField y "Valor" para DataValueField, por supuesto.)

De hecho, sugiero que, como parece que realmente quieres una lista de en lugar de un diccionario, es posible que quieras reconsiderar el uso de un diccionario en primer lugar. Se podí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)); 
} 

alternativa, puede utilizar una lista de valores de fricción CultureInfo. LINQ lo hace muy fácil:

var cultures = service.LanguagesAvailable() 
         .Select(language => new CultureInfo(language)); 
languageList.DataTextField = "DisplayName"; 
languageList.DataValueField = "Name"; 
languageList.DataSource = cultures; 
languageList.DataBind(); 

Si no se está usando LINQ, todavía se puede utilizar un foreach rizo:

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

En realidad, esto es incorrecto - ver mi comentario sobre la respuesta aceptada. –

+0

Ah, leería mal la pregunta. Me parece confuso ponerlos en un diccionario al estilo "equivocado". Editaré mi respuesta. –

+1

@JonSkeet El motivo de la asociación "hacia atrás" es que los datos almacenados en el diccionario como pareja clave/valor normalmente utilizan la clave (valor de búsqueda) como asociación de datos (por ejemplo, para referencia de bases de datos) y en un menú desplegable lista, esto corresponde al DataValueField, es decir, el ** valor de retorno ** de un POST, que le dice más sobre el elemento seleccionado que el DataTextField, es decir,el valor de visualización. (DropDownLists solo tiene una convención de nomenclatura pobre) – Dani

6

sólo tiene que utilizar "clave" y "Valor"

+6

Alguien ya dijo eso. ¡Pero buen intento! Bienvenido a SO :) – scraimer

5

Si el DropDownList es declar ed 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 
    } 
}; 
+0

Matt seguro que esto funcionará? –

+0

¡Funciona perfectamente bien! – Druid

+0

Votación máxima. Es notable que se REQUIERE que este sea un objeto del lado del servidor para ser evaluado. No puede pasarlo en línea usando <%# syntax %>. Ya sea que sea un

Cuestiones relacionadas