2009-04-30 8 views
100

mag ich DataTextField und DataValueField eine Dropdownlist (Sprachenliste) mit einem Wörterbuch (Liste) von languageCod (de-de) als Schlüssel und Sprache Name (Englisch) setzen, wie der Text angezeigt werden soll.C# Dropdownlist mit einem Wörterbuch als Datasource

Relevante Code:

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

Wie kann ich DataTextField und DataValueField?

Antwort

186

Wie die Sie Datatextfield und Datavaluefield von Dropdownlist mit „Key einstellen:

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

Wenn Sie nicht LINQ verwenden, Sie immer noch eine normale foreach-Schleife verwenden können "und "Value" Texte:

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

Ich würde empfehlen, TextField auf "key" und ValueField auf Value zu setzen. Ich denke, das ist intuitiver. – MGOwen

+14

@ MGOwen Es mag intuitiv sein, DataValueField auf Value zu setzen, wegen des gemeinsamen "Value", aber es ist eigentlich unlogisch in der regulären Verwendung der Datenstruktur/Kontrolle. Details dazu finden Sie in meinem Kommentar zu Jon Skeets Antwort. – Dani

+0

Ich sehe keine Liste. Fügen Sie hinzu, dass 2 Argumente. Nur eine, die ein Argument dauert. ist das winforms? – hrh

10

Wenn ein Wörterbuch aufgezählt wird, wird es KeyValuePair<TKey,TValue> Objekte ergeben ... so müssen Sie nur „Value“ und „Key“ für DataTextField und DataValueField bzw. geben Sie die Value/Key Eigenschaften auszuwählen.

Dank Joe's Kommentar, habe ich die Frage erneut gelesen, um diese richtig zu machen. Normalerweise würde ich erwarten, dass der "Schlüssel" im Wörterbuch der angezeigte Text ist und der "Wert" der Wert ist, der abgerufen wird. Ihr Beispielcode verwendet sie jedoch umgekehrt. Es sei denn, Sie wirklich brauchen diese Art und Weise zu sein, möchten Sie vielleicht zu prüfen, Ihren Code wie das Schreiben:

(Und dann ändert sich die Bindung zu verwenden „Key“ für DataTextField und „Value“ für DataValueField, natürlich.)

In der Tat würde ich vorschlagen, dass, wie es scheint, Sie wirklich eine Liste eher als ein Wörterbuch wollen, möchten Sie vielleicht überdenken mit einem Wörterbuch an erster Stelle. Sie könnten nur ein List<KeyValuePair<string, string>> verwenden:

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

Alternativ können Sie eine Liste von einfachen CultureInfo Werte. LINQ macht dies einfach:

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

Eigentlich ist falsch - mein Kommentar über die akzeptierte Antwort sehen. –

+0

Ah, ich habe die Frage falsch verstanden. Es erscheint mir verwirrend, sie in einem Wörterbuch "falsch" herum zu schreiben. Wird meine Antwort bearbeiten. –

+1

@JonSkeet Der Grund für die Rückwärtszugehörigkeit ist, dass die Daten, die im Wörterbuch als Schlüssel/Wert-Paar gespeichert werden, normalerweise den Schlüssel (Nachschlagewert) als Datenzuordnung (z. B. für Datenbankreferenzierung) und in einem Dropdown-Menü verwenden Liste entspricht dies dem DataValueField, also dem ** Rückgabewert ** eines POST, der Ihnen mehr über das ausgewählte Objekt als das DataTextField, alsoder Anzeigewert. (DropDownLists haben nur eine schlechte Benennungskonvention) – Dani

6

verwenden Sie einfach "Key" und "Value"

+6

Das hat schon jemand gesagt. Aber guter Versuch! Willkommen bei SO :) – scraimer

5

Wenn die Dropdownlist declar ist Ed in Ihrer Aspx-Seite und nicht im Codebehind, können Sie es so machen.

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 sicher, das wird funktionieren? –

+0

Funktioniert einwandfrei! – Druid

+0

Upvoted. Es ist bemerkenswert, dass es erforderlich ist, dass dies ein serverseitiges Objekt ist, das ausgewertet werden soll. Sie können es nicht inline mit <%# syntax %> übergeben. Sei es ein