【问题标题】:C# DropDownList with a Dictionary as DataSource将字典作为数据源的 C# DropDownList
【发布时间】:2010-10-22 18:42:22
【问题描述】:

我想设置 Dropdownlist (languageList) 的 DataTextFieldDataValueField 使用 languageCod (en-gb) 的 Dictionary (list) 作为键和语言名称 (english) 作为要显示的文本.

相关代码:

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

如何设置DataTextFieldDataValueField

【问题讨论】:

    标签: c# dictionary drop-down-menu


    【解决方案1】:

    枚举字典时会产生KeyValuePair&lt;TKey,TValue&gt;对象...所以你只需要分别为DataTextFieldDataValueField指定“Value”和“Key”即可选择Value/@ 987654323@属性。

    感谢乔的评论,我重新阅读了这个问题以正确解决这些问题。通常我希望字典中的“键”是显示的文本,而“值”是获取的值。您的示例代码以相反的方式使用它们。除非您真的需要它们,否则您可能需要考虑将代码编写为:

    list.Add(cul.DisplayName, cod);
    

    (当然,然后将绑定更改为使用DataTextField 的“Key”和DataValueField 的“Value”。)

    事实上,我建议您似乎确实想要一个 list 而不是字典,因此您可能首先要重新考虑使用字典。你可以使用List&lt;KeyValuePair&lt;string, string&gt;&gt;:

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

    或者,使用简单的CultureInfo 值列表。 LINQ 让这一切变得非常简单:

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

    如果您不使用 LINQ,您仍然可以使用普通的 foreach 循环:

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

    【讨论】:

    • 实际上,这是不正确的 - 请参阅我对已接受答案的评论。
    • 啊,我误读了这个问题。以“错误”的方式将它们放入字典中似乎让我感到困惑。将编辑我的答案。
    • @JonSkeet “向后”关联的原因是作为键/值对存储在字典中的数据通常使用键(查找值)作为数据关联(例如,对于数据库引用),并且在下拉列表中,这对应于 DataValueField,即 POST 的 返回值,它比 DataTextField(即显示值)告诉您更多有关所选项目的信息。 (DropDownLists 只是有一个糟糕的命名约定)
    【解决方案2】:

    就像你可以使用“Key”和“Value”文本设置DropDownList的DataTextField和DataValueField:

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

    【讨论】:

    • 我建议将 TextField 设置为“key”,将 ValueField 设置为 Value。我认为这更直观。
    • @MGOwen 将 DataValueField 设置为 Value 可能似乎直观,因为常见的“Value”,但在常规使用数据结构/控件时实际上是不合逻辑的。有关这方面的详细信息,请参阅我对 Jon Skeet 回答的评论。
    • 我没有看到一个列表。添加需要 2 个 args.. 只有一个需要一个 args。这是winforms吗??
    • @hrh 那么你可能没有使用Dictionary&lt;TKey, TValue&gt;,但可能是List&lt;T&gt;
    • @Canavar 是否可以将 DataText 字段设置为“key-Value”......?我该怎么做。
    【解决方案3】:

    只需使用“键”和“值”

    【讨论】:

      【解决方案4】:

      如果 DropDownList 是在您的 aspx 页面中声明的,而不是在代码隐藏中,您可以这样做。

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

      【讨论】:

      • 赞成。值得注意的是,它必须是要评估的服务器端对象。您不能使用 内联传递它。无论是
      猜你喜欢
      • 2011-09-11
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 2010-09-26
      • 1970-01-01
      • 2016-09-17
      相关资源
      最近更新 更多