将字典作为数据源的 C# DropDownList
Posted
技术标签:
【中文标题】将字典作为数据源的 C# DropDownList【英文标题】:C# DropDownList with a Dictionary as DataSource 【发布时间】:2010-10-22 18:42:22 【问题描述】:我想设置 Dropdownlist
(languageList) 的 DataTextField
和 DataValueField
使用 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();
如何设置DataTextField
和DataValueField
?
【问题讨论】:
【参考方案1】:枚举字典时会产生KeyValuePair<TKey,TValue>
对象...所以你只需要分别为DataTextField
和DataValueField
指定“Value”和“Key”即可选择Value/@ 987654323@属性。
感谢乔的评论,我重新阅读了这个问题以正确解决这些问题。通常我希望字典中的“键”是显示的文本,而“值”是获取的值。您的示例代码以相反的方式使用它们。除非您真的需要它们,否则您可能需要考虑将代码编写为:
list.Add(cul.DisplayName, cod);
(当然,然后将绑定更改为使用DataTextField
的“Key”和DataValueField
的“Value”。)
事实上,我建议您似乎确实想要一个 list 而不是字典,因此您可能首先要重新考虑使用字典。你可以使用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));
或者,使用简单的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<TKey, TValue>
,但可能是List<T>
。
@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的主要内容,如果未能解决你的问题,请参考以下文章