将字典作为数据源的 C# DropDownList

Posted

技术标签:

【中文标题】将字典作为数据源的 C# DropDownList【英文标题】:C# DropDownList with a Dictionary as DataSource 【发布时间】: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

【问题讨论】:

【参考方案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
    
;

【讨论】:

赞成。值得注意的是,它必须是要评估的服务器端对象。您不能使用 内联传递它。无论是

以上是关于将字典作为数据源的 C# DropDownList的主要内容,如果未能解决你的问题,请参考以下文章

C#中的DropDownList,每次使用选择项目后都会使DropDownList项目溢出

关于C# DropDownList 动态加载数据笔记

JavaScript 中的 C# 字典等效项

C#如何dropdownlist赋值

C# 将字典转换为类似字符串的 CSV

DropDownList.SelectedItem.Text 始终是 DropDownList C# 中的第一项