C # DropDownList mit einem Wörterbuch als DataSource


112

Ich möchte eine (languageList) festlegen DataTextFieldund ein Wörterbuch (Liste) von (en-gb) als Schlüssel und einen Sprachnamen (Englisch) als anzuzeigenden Text verwenden.DataValueFieldDropdownlistlanguageCod

Relevanter 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 einstellen DataTextFieldund DataValueField?

Antworten:


205

So können Sie DataTextField und DataValueField von DropDownList mithilfe der Texte "Key" und "Value" festlegen:

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

12
Ich würde empfehlen, TextField auf "key" und ValueField auf Value zu setzen. Ich finde das intuitiver.
MGOwen

15
@MGOwen Es kann scheinen intuitiv zu Datavaluefield Wert zu setzen, weil der gemeinsamen „Value“, aber es ist eigentlich unlogisch in regelmäßigem Gebrauch der Datenstruktur / Kontrolle. Einzelheiten hierzu finden Sie in meinem Kommentar zur Antwort von Jon Skeet.
Dani

Ich sehe keine Liste. Fügen Sie hinzu, dass 2 Argumente benötigt werden. Nur eines, das ein Argument benötigt. ist das Winforms?
Stunde

@hrh dann benutzt du wahrscheinlich nicht a Dictionary<TKey, TValue>, aber vielleicht a List<T>.
Show

@Canavar ist es möglich, das DataText-Feld als "Schlüsselwert" festzulegen ....? Wie kann ich es tun.
Sravan Kumar

11

Wenn ein Wörterbuch aufgezählt wird, wird es ergeben KeyValuePair<TKey,TValue>Objekte ... so dass Sie nur angeben müssen „Value“ und „Key“ für DataTextFieldund DataValueFieldjeweils die Auswahl Wert / Schlüsseleigenschaften.

Dank Joes Kommentar habe ich die Frage noch einmal gelesen, um diese richtig zu machen. Normalerweise würde ich erwarten, dass der "Schlüssel" im Wörterbuch der angezeigte Text und der "Wert" der abgerufene Wert ist. Ihr Beispielcode verwendet sie jedoch umgekehrt. Wenn Sie sie nicht wirklich so benötigen, sollten Sie Ihren Code wie folgt schreiben:

list.Add(cul.DisplayName, cod);

(Und dann die Bindung ändern , um natürlich "Schlüssel" für DataTextFieldund "Wert" für zu verwenden DataValueField.)

Tatsächlich würde ich vorschlagen, dass Sie, da es so aussieht, als ob Sie wirklich eine Liste anstelle eines Wörterbuchs möchten, die Verwendung eines Wörterbuchs zunächst überdenken möchten. Sie könnten einfach ein 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));
}

Verwenden Sie alternativ eine Liste mit einfachen CultureInfoWerten. LINQ macht das wirklich einfach:

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

Wenn Sie LINQ nicht verwenden, können Sie dennoch eine normale foreach-Schleife verwenden:

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 das falsch - siehe meinen Kommentar zur akzeptierten Antwort.
Winston Smith

Ah, ich würde die Frage falsch verstehen. Es scheint mir verwirrend, sie "falsch" in ein Wörterbuch aufzunehmen. Wird meine Antwort bearbeiten.
Jon Skeet

1
@JonSkeet Der Grund für die "Rückwärts" -Zuordnung ist, dass die im Wörterbuch als Schlüssel / Wert-Paar gespeicherten Daten normalerweise den Schlüssel (Suchwert) als Datenzuordnung (z. B. zur Datenbankreferenzierung) und in einer Dropdown-Liste verwenden Dies entspricht dem DataValueField, dh dem Rückgabewert eines POST, der mehr über das ausgewählte Element aussagt als das DataTextField, dh den Anzeigewert. (DropDownLists haben nur eine schlechte Namenskonvention)
Dani

6

Wenn die DropDownList auf Ihrer Aspx-Seite und nicht im Codebehind deklariert ist, können Sie dies folgendermaßen tun.

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

Upvoted. Es ist bemerkenswert, dass es ERFORDERLICH ist, dass dies ein zu bewertendes serverseitiges Objekt ist. Sie können es nicht mit <% # syntax%> inline übergeben. Ob dies ein <script runat = "server"> ist oder wie in Matts Beispiel oben gezeigt, liegt ganz bei Ihnen. Es funktioniert tatsächlich.
Barry

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.