web-dev-qa-db-fra.com

DropDownList C # avec un dictionnaire comme source de données

Je veux définir DataTextField et DataValueField d'un Dropdownlist (languageList) à l'aide d'un dictionnaire (liste) de languageCod (en-gb) comme clé et langage nom (anglais) comme texte à afficher.

Code pertinent:

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

Comment définir DataTextField et DataValueField?

106
VansFannel

Ainsi, vous pouvez définir DataTextField et DataValueField de DropDownList en utilisant les textes "Key" et "Value":

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

Quand un dictionnaire est énuméré, il donnera KeyValuePair<TKey,TValue> objets ... il vous suffit donc de spécifier "Valeur" et "Clé" pour DataTextField et DataValueField, respectivement, pour sélectionner Valeur / clé propriétés.

Grâce au commentaire de Joe, j'ai relu la question pour bien les interpréter. Normalement, je m'attendrais à ce que la "clé" du dictionnaire soit le texte affiché et la "valeur" la valeur extraite. Votre exemple de code les utilise cependant dans l'autre sens. À moins que vous n'ayez vraiment besoin qu'ils soient ainsi, vous pouvez envisager d'écrire votre code comme suit:

list.Add(cul.DisplayName, cod);

(Et puis changer la liaison pour utiliser "Key" pour DataTextField et "Value" pour DataValueField, bien sûr.)

En fait, je suggérerais que, comme il semble que vous souhaitiez réellement une liste plutôt qu'un dictionnaire, vous voudrez peut-être reconsidérer l'utilisation d'un dictionnaire dans première place. Vous pouvez simplement utiliser 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));
}

Vous pouvez également utiliser une liste de valeurs simples CultureInfo. LINQ rend cela vraiment facile:

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

Si vous n'utilisez pas LINQ, vous pouvez toujours utiliser une boucle foreach normale:

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();
10
Jon Skeet

Si la liste DropDownList est déclarée dans votre page aspx et non dans le codeBear, vous pouvez le faire comme ceci.

.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
    }
};
6
Matt Frear

Il suffit d'utiliser "Key" et "Value"

5
user98296