C # Dropdownlist mit einem Wörterbuch als Datasource
-
03-07-2019 - |
Frage
Ich mag DataTextField
und DataValueField
einer Dropdownlist
(Sprachenliste) mit einem Wörterbuch (Liste) von languageCod
(de-de) als Schlüssel und Sprache Namen (Englisch) als der Text setzen angezeigt werden soll.
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
?
Lösung
Wie, dass Sie und Datatextdatavaluefield von Dropdownlist mit „Key“ und „Value“ Texte 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();
Andere Tipps
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
angeben bzw. die Wert / Key Eigenschaften.
Dank Joe Kommentar, nachzulesen ich die Frage diese richtig herum zu bekommen. Normalerweise würde ich den „Schlüssel“ im Wörterbuch erwarten, dass der Text sein, die angezeigt wird, und der „Wert“ der Wert abgerufen werden. Ihr Beispielcode verwendet sie umgekehrt aber. Es sei denn, Sie wirklich brauchen, so zu sein, möchten Sie vielleicht Ihren Code betrachten das Schreiben als:
list.Add(cul.DisplayName, cod);
(Und dann ändert sich die Bindung zu verwenden "Key" für DataTextField
und "Value" für DataValueField
, natürlich.)
In der Tat, ich würde vorschlagen, dass, wie es scheint Sie wirklich eine Liste willst anstatt ein Wörterbuch, könnte man mit einem Wörterbuch in erster Linie zu überdenken. Sie könnten nur einen 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 verwenden. LINQ macht dies einfach:
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, können Sie immer noch 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();
Wenn die Dropdownlist in Ihrer aspx Seite erklärt wird und nicht in dem Code-Behind, können Sie es wie folgt 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
}
};
Verwenden Sie einfach "Key" und "Wert"