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

以字典作为数据源的C#DropDownList,c#,dictionary,drop-down-menu,C#,Dictionary,Drop Down Menu,我想使用languageCod(en gb)的字典(列表)作为键,使用语言名称(英语)作为要显示的文本,设置Dropdownlist(语言列表)的DataTextField和DataValueField 相关代码: string[] languageCodsList= service.LanguagesAvailable(); Dictionary<string, string> list = new Dictionary<string,

我想使用
languageCod
(en gb)的字典(列表)作为键,使用语言名称(英语)作为要显示的文本,设置
Dropdownlist
(语言列表)的
DataTextField
DataValueField

相关代码:

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();
string[]languageCodsList=service.languageSavaailable();
字典列表=
新词典(languageCodsList.Length);
foreach(语言codslist中的字符串cod)
{
CultureInfo cul=新的CultureInfo(cod);
列表。添加(cod、cul.DisplayName);
}
languageList.DataSource=list;
languageList.DataBind();

如何设置
DataTextField
DataValueField

当枚举字典时,它将生成对象。。。因此,您只需分别为
DataTextField
DataValueField
指定“Value”和“Key”,即可选择/properties

多亏了乔的评论,我重新阅读了这个问题,以便正确地理解这些问题。通常我希望字典中的“键”是显示的文本,“值”是获取的值。但是,您的示例代码反过来使用它们。除非你真的需要这样做,否则你可能会想把你的代码写为:

list.Add(cul.DisplayName, cod);
(然后将绑定更改为对
DataTextField
使用“Key”,当然对
DataValueField
使用“Value”)

事实上,我建议,因为你似乎真的想要一个列表而不是一本字典,你可能首先要重新考虑使用字典。您可以使用
列表

如果不使用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();
List cultures=new List();
foreach(service.LanguagesAvailable()中的字符串cod)
{
添加(新文化信息(cod));
}
languageList.DataTextField=“DisplayName”;
languageList.DataValueField=“Name”;
languageList.DataSource=文化;
languageList.DataBind();

您可以使用“键”和“值”文本设置DropDownList的DataTextField和DataValueField:

字典列表=新字典();
列表。添加(“第1项”、“第1项”);
列表。添加(“第2项”、“第2项”);
列表。添加(“第3项”、“第3项”);
列表。添加(“第4项”、“第4项”);
ddl.DataSource=list;
ddl.DataTextField=“值”;
ddl.DataValueField=“Key”;
ddl.DataBind();

只要使用“键”和“值”

如果DropDownList是在您的aspx页面中声明的,而不是在codebehind中声明的,您可以这样做

.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
    }
};
受保护的无效页面加载(对象发送方,事件参数e)
{
ddlStatus.DataBind();
//或者使用Page.DataBind()绑定所有内容
}
公共词典状态
{
得到
{
//在此处执行数据库/Web服务查找以填充字典
}
};

事实上,这是不正确的-请看我对公认答案的评论。啊,我误解了这个问题。在我看来,把它们按“错误”的方式放在字典里似乎令人困惑。将编辑我的答案。@jonsket“向后”关联的原因是,作为键/值对存储在字典中的数据通常使用键(查找值)作为数据关联(例如,用于数据库引用),在下拉列表中,这对应于DataValueField,即POST的返回值,它告诉您有关所选项目的更多信息,而不是DataTextField,即显示值。(DropDownLists只是有一个糟糕的命名约定)我建议将TextField设置为“key”,将ValueField设置为Value。我认为这更直观。@MGOwen将DataValueField设置为Value似乎很直观,因为它有一个常见的“Value”,但在经常使用datastructure/control时,这实际上是不合逻辑的。有关这方面的详细信息,请参阅我对Jon Skeet答案的评论。我没有看到列表。添加需要2个参数。。只有一个需要一个arg。这是winforms吗???@hrh那么您可能没有使用
字典
,但可能使用
列表
@Canavar是否可以将数据文本字段设置为“键值”。。。。?我怎么能做到呢,投了赞成票。值得注意的是,这是一个需要评估的服务器端对象。您不能使用内联传递它。无论这是一个,还是如马特的例子所示,都取决于你。它确实有效。
    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();
<asp:DropDownList ID="ddlStatus" runat="server" DataSource="<%# Statuses %>"
     DataValueField="Key" DataTextField="Value"></asp:DropDownList>
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
    }
};