2009-04-30 13 views
100

voglio impostare DataTextField e DataValueField di un Dropdownlist (languageList) utilizzando un dizionario (lista) di languageCod (en-GB) come la chiave e il linguaggio nome (inglese) come il testo da visualizzare.C# DropDownList con un dizionario come DataSource

codice rilevante:

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

Come posso impostare DataTextField e DataValueField?

risposta

186

Come che è possibile impostare DataTextField e DataValueField di DropDownList utilizzando "Chiave "e "valore" testi:

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

Consiglierei l'impostazione di TextField su "chiave" e Valore campo su Valore. Penso che sia più intuitivo. – MGOwen

+14

@ MGOwen Può essere _seem_ intuitivo impostare DataValueField su Valore, a causa del comune "Valore", ma in realtà è illogico nell'uso regolare della struttura dati/controllo. Per i dettagli su questo, vedere il mio commento sulla risposta di Jon Skeet. – Dani

+0

Non vedo un elenco. Aggiungi che richiede 2 arg .. solo uno che prende un arg. è questa winforms ?? – hrh

10

Quando un dizionario è enumerato, sarà resa KeyValuePair<TKey,TValue> oggetti ... quindi è solo bisogno di specificare "Valore" e "Key" per DataTextField e DataValueField, rispettivamente, per selezionare i Value/Key proprietà.

Grazie al commento di Joe, ho riletto la domanda per ottenerli nel modo giusto. Normalmente mi aspetterei che la "chiave" nel dizionario sia il testo che viene visualizzato e che il "valore" sia il valore recuperato. Il tuo codice di esempio li usa al contrario. A meno che non si ha realmente bisogno loro di essere in questo modo, si potrebbe prendere in considerazione la scrittura del codice come:

(E poi cambiando il legame di usare "chiave" per DataTextField e "Valore" per DataValueField, naturalmente.

In effetti, suggerirei che come sembra davvero che tu voglia un elenco anziché un dizionario, potresti voler riconsiderare l'uso di un dizionario in primo luogo. Si potrebbe utilizzare 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, utilizzare un elenco di semplici CultureInfo valori. LINQ rende il tutto veramente facile:

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

Se non stai usando LINQ, è comunque possibile utilizzare un normale ciclo foreach:

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

In realtà, questo non è corretto - vedi il mio commento alla risposta accettata. –

+0

Ah, avrei letto male la domanda. Mi sembra strano confonderli in un dizionario "sbagliato". Modificherà la mia risposta. –

+1

@JonSkeet Il motivo dell'associazione "backwards" è che i dati memorizzati nel dizionario come coppia chiave/valore normalmente utilizzano la chiave (valore di ricerca) come associazione dati (ad esempio per il riferimento al database) e in un menu a discesa lista, questo corrisponde al DataValueField, cioè al ** valore di ritorno ** di un POST, che ti dice di più sull'elemento selezionato rispetto a DataTextField, cioèil valore di visualizzazione. (DropDownLists ha solo una convenzione di denominazione scadente) – Dani

6

Basta usare "Key" e "Valore"

+6

Qualcuno lo ha già detto. Ma buon tentativo! Benvenuti a SO :) – scraimer

5

Se la DropDownList è declar nella tua pagina aspx e non nel codebehind, puoi farlo in questo modo.

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 sicuro che questo funzionerà ?? –

+0

Funziona perfettamente! – Druid

+0

Venerato. È interessante notare che è OBBLIGATORIO che questo sia un oggetto lato server da valutare. Non puoi passarlo in linea usando <%# syntax %>. Sia che si tratti di un , o come si vede nell'esempio di Matt sopra, fino a voi. Funziona davvero. – Barry

Problemi correlati