C#DropDownList,字典为DataSource

Van*_*nel 108 c# dictionary drop-down-menu

我想设置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();
Run Code Online (Sandbox Code Playgroud)

我怎么设置DataTextFieldDataValueField

Can*_*var 201

像这样你可以使用"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();
Run Code Online (Sandbox Code Playgroud)

  • @MGOwen由于常见的"值",可能_seem_直观地将DataValueField设置为Value,但在常规使用数据结构/控件时实际上是不合逻辑的.有关详细信息,请参阅我对Jon Skeet的回答的评论. (15认同)
  • 我建议将TextField设置为"key",将ValueField设置为Value.我认为这更直观. (11认同)

Jon*_*eet 10

当字典枚举,它会产生KeyValuePair<TKey,TValue>的对象...所以你只需要指定"价值"和"密钥" DataTextField,并DataValueField分别选择价值/关键特性.

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

list.Add(cul.DisplayName, cod);
Run Code Online (Sandbox Code Playgroud)

(然后更改绑定以使用"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));
}
Run Code Online (Sandbox Code Playgroud)

或者,使用普通CultureInfo值列表.LINQ使这很容易:

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

如果您没有使用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();
Run Code Online (Sandbox Code Playgroud)

  • 实际上,这是不正确的 - 请参阅我对已接受答案的评论. (3认同)

Mat*_*ear 6

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

的.aspx:

<asp:DropDownList ID="ddlStatus" runat="server" DataSource="<%# Statuses %>"
     DataValueField="Key" DataTextField="Value"></asp:DropDownList>
Run Code Online (Sandbox Code Playgroud)

.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
    }
};
Run Code Online (Sandbox Code Playgroud)


小智 5

只需使用"密钥"和"价值"

  • 有人已经说过了.但好好试试!欢迎来到SO :) (6认同)