使用字典作为数据源的C#DropDownList


112

我想设置DataTextFieldDataValueField一个中Dropdownlist使用的词典(名单)(languageList)languageCod(EN-GB)的关键和语言名称(英文)作为文本显示。

相关代码:

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

Answers:


205

这样,您可以使用“键”和“值”文本设置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();

12
我建议将TextField设置为“键”,将ValueField设置为Value。我认为这更直观。
MGOwen

15
@MGOwen 由于常见的“值”,将DataValueField设置为Value 似乎很直观,但是在常规使用数据结构/控件时实际上是不合逻辑的。有关详细信息,请参阅我对Jon Skeet答案的评论。
丹妮(Dani)

我没有看到list.Add需要2个args ..只有一个需要1个args。这是winforms吗?
hrh 2012年

@hrh,那么您可能未使用Dictionary<TKey, TValue>,但可能使用了List<T>
sshow 2012年

@Canavar是否可以将DataText字段设置为“键值” ..?我该怎么做。
Sravan Kumar 2013年

11

枚举字典时,它将产生KeyValuePair<TKey,TValue>对象...因此,您只需分别为DataTextField和指定“值”和“键” DataValueField,以选择“ / 键”属性。

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

list.Add(cul.DisplayName, cod);

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

实际上,我建议您似乎确实确实希望使用列表而不是字典,所以您可能首先需要重新考虑使用字典。您可以使用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();

3
实际上,这是不正确的-请参阅我对已接受答案的评论。
温斯顿·史密斯2009年

啊,我会误解这个问题。以“错误”的方式将它们放入字典中似乎使我感到困惑。将编辑我的答案。
乔恩·斯基特

1
@JonSkeet进行“向后”关联的原因是,作为键/值对存储在字典中的数据通常使用键(查找值)作为数据关联(例如,用于数据库引用)和下拉列表中,它对应于DataValueField,即POST 的返回值,它比DataTextField(即显示值)告诉您有关所选项目的更多信息。(DropDownLists的命名约定很差)
Dani 2012年

6

如果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
    }
};

已投票。值得注意的是,这必须是要评估的服务器端对象。您不能使用<%#语法%>内联传递它。不管是<script runat =“ server”>,还是上面的Matt例子中所见,都取决于您。确实可以。
巴里

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.