C# DropDownList with a Dictionary as DataSource

前端 未结 4 1392
醉梦人生
醉梦人生 2020-12-12 20:13

I want to set DataTextField and DataValueField of a Dropdownlist (languageList) using a Dictionary (list) of languageCod

4条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-12 20:24

    When a dictionary is enumerated, it will yield KeyValuePair objects... so you just need to specify "Value" and "Key" for DataTextField and DataValueField respectively, to select the Value/Key properties.

    Thanks to Joe's comment, I reread the question to get these the right way round. Normally I'd expect the "key" in the dictionary to be the text that's displayed, and the "value" to be the value fetched. Your sample code uses them the other way round though. Unless you really need them to be this way, you might want to consider writing your code as:

    list.Add(cul.DisplayName, cod);
    

    (And then changing the binding to use "Key" for DataTextField and "Value" for DataValueField, of course.)

    In fact, I'd suggest that as it seems you really do want a list rather than a dictionary, you might want to reconsider using a dictionary in the first place. You could just use a List>:

    string[] languageCodsList = service.LanguagesAvailable();
    var list = new List>();
    
    foreach (string cod in languageCodsList)
    {
        CultureInfo cul = new CultureInfo(cod);
        list.Add(new KeyValuePair(cul.DisplayName, cod));
    }
    

    Alternatively, use a list of plain CultureInfo values. LINQ makes this really easy:

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

    If you're not using LINQ, you can still use a normal foreach loop:

    List cultures = new List();
    foreach (string cod in service.LanguagesAvailable())
    {
        cultures.Add(new CultureInfo(cod));
    }
    languageList.DataTextField = "DisplayName";
    languageList.DataValueField = "Name";
    languageList.DataSource = cultures;
    languageList.DataBind();
    

提交回复
热议问题