2009-04-30 11 views
100

Chcę ustawić DataTextField i DataValueField o Dropdownlist (languageList) stosując słownik (lista) z languageCod (en-GB) jako nazwę klucza i język (angielski) jako tekst do wyświetlenia.C# DropDownList ze słownikiem jako DataSource

odpowiedni kod:

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

Jak mogę ustawić DataTextField i DataValueField?

Odpowiedz

186

jak ten można ustawić DataTextField i DataValueField z DropDownList za pomocą „klucza "i "wartość" teksty:

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

Polecam ustawienie TextField na "key" i ValueField na wartość. Myślę, że to jest bardziej intuicyjne. – MGOwen

+14

@MGOwen Może to być intuicyjne, aby ustawić DataValueField na wartość, ze względu na wspólną "wartość", ale w rzeczywistości jest nielogiczne w regularnym korzystaniu z bazy danych/kontroli. Aby uzyskać szczegółowe informacje na ten temat, zobacz mój komentarz na temat odpowiedzi Jona Skeeta. – Dani

+0

Nie widzę listy.Dodano, że ma 2 argumenty .. tylko jeden, który ma jeden argument. czy to jest winForm? – hrh

10

Kiedy słownika wymienił, to wydajność KeyValuePair<TKey,TValue> obiektów ... więc po prostu trzeba określić „wartość” i „klucz” do DataTextField i DataValueField odpowiednio wybrać Value/Key właściwości.

Dzięki komentarzowi Joe ponownie przeczytałem pytanie, aby uzyskać te informacje we właściwy sposób. Normalnie spodziewam się, że "klucz" w słowniku będzie tekstem wyświetlanym, a "wartością" będzie wartość pobrana. Twój przykładowy kod używa ich jednak odwrotnie. Chyba, że ​​naprawdę ich potrzebują być w ten sposób, to może warto rozważyć pisania kodu jako:

(A potem zmienia wiązanie używać „klucz” dla DataTextField i „wartość” dla DataValueField, oczywiście.)

W rzeczywistości sugeruję, że tak naprawdę wygląda na to, że chcesz raczej mieć listę niż słownik, więc możesz najpierw rozważyć użycie słownika. można po prostu użyć 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)); 
} 

Alternatywnie, użyj listę zwykły CultureInfo wartości. LINQ czyni to bardzo proste:

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

Jeśli nie używasz LINQ, można nadal korzystać z normalnej pętli 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

Faktycznie, jest to błędne - patrz mój komentarz na temat przyjętego odpowiedź. –

+0

Ah, źle odczytałem pytanie. Mylące wydaje mi się umieszczenie ich w słowniku "w niewłaściwy sposób". Zmodyfikuje moją odpowiedź. –

+1

@JonSkeet Powodem stowarzyszenia "wstecznego" jest to, że dane przechowywane w słowniku jako para klucz/wartość zwykle używają klucza (wartości wyszukiwania) jako powiązania danych (np. Do odwoływania do bazy danych) oraz w menu rozwijanym list, odpowiada to wartości DataValueField, czyli ** wartości zwracanej ** POST, która mówi więcej o wybranym elemencie niż DataTextField, tj.wyświetlana wartość. (DropDownLists ma po prostu kiepską konwencję nazewnictwa) – Dani

6

Wystarczy użyć "klucz" i "wartość"

+6

Ktoś już to powiedział. Ale spróbuj! Witaj w SO :) – scraimer

5

Jeśli DropDownList jest declar ed na stronie aspx, a nie w codebehind, możesz to zrobić w ten sposób.

.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 pewnie, że to zadziała? –

+0

Działa idealnie dobrze! – Druid

+0

Rewizja. Warto zauważyć, że WYMAGANE jest, aby był to obiekt po stronie serwera do oceny. Nie można go przekazać inline przy użyciu <%# syntax %>. Niezależnie od tego, czy to

Powiązane problemy