C # DropDownList со словарем в качестве источника данных - PullRequest
106 голосов
/ 30 апреля 2009

Я хочу установить DataTextField и DataValueField для 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();

Как мне установить DataTextField и DataValueField?

Ответы [ 4 ]

198 голосов
/ 30 апреля 2009

Таким образом, вы можете установить DataTextField и DataValueField для DropDownList, используя тексты «Key» и «Value»:

    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();
10 голосов
/ 30 апреля 2009

При перечислении словаря он выдаст KeyValuePair<TKey,TValue> объектов ... поэтому вам просто нужно указать "Значение" и "Ключ" для DataTextField и DataValueField соответственно, чтобы выбрать Значение / Ключ Свойства.

Благодаря комментарию Джо, я перечитал вопрос, чтобы получить правильные ответы. Обычно я ожидаю, что «ключ» в словаре будет отображаемым текстом, а «значение» будет выбранным значением. Ваш пример кода использует их наоборот. Если вам не нужно, чтобы они были такими, возможно, вы захотите написать свой код следующим образом:

list.Add(cul.DisplayName, cod);

(И затем изменение привязки, чтобы использовать «Ключ» для DataTextField и «Значение» для 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();
6 голосов
/ 28 мая 2009

Если 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
    }
};
6 голосов
/ 30 апреля 2009

Просто используйте «Ключ» и «Значение»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...