C# DropDownList with a Dictionary as DataSource

前端 未结 4 1384
醉梦人生
醉梦人生 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:23

    Just use "Key" and "Value"

    0 讨论(0)
  • 2020-12-12 20:24

    When a dictionary is enumerated, it will yield KeyValuePair<TKey,TValue> 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<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));
    }
    

    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<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();
    
    0 讨论(0)
  • 2020-12-12 20:45

    If the DropDownList is declared in your aspx page and not in the codebehind, you can do it like this.

    .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 讨论(0)
  • 2020-12-12 20:48

    Like that you can set DataTextField and DataValueField of DropDownList using "Key" and "Value" texts :

        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();
    
    0 讨论(0)
提交回复
热议问题