C # DropDownList со словарем в качестве источника данных

112

Я хочу , чтобы установить DataTextFieldи DataValueFieldиз Dropdownlist(languageList) с использованием словаря (список) languageCod(ан-гб) в качестве ключа и названия языка (английского) в качестве текста на дисплее.

Соответствующий код:

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?

VansFannel
источник

Ответы:

205

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

    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 может показаться интуитивно понятной из-за общего «Value», но на самом деле это нелогично при регулярном использовании структуры данных / элемента управления. Подробнее об этом см. Мой комментарий к ответу Джона Скита.
Дэни
Я не вижу списка. Add, который принимает 2 аргумента .. только один, который принимает один аргумент. это winforms ??
2012,
@hrh, то вы, вероятно, не используете a Dictionary<TKey, TValue>, но, возможно, a List<T>.
sshow
@Canavar можно ли установить поле DataText как "ключ-значение" ....? Как мне это сделать.
Sravan Kumar
11

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

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

list.Add(cul.DisplayName, cod);

(А затем изменив привязку, чтобы использовать "Ключ" для DataTextFieldDataValueField , конечно, и «Значение» .)

На самом деле, я бы посоветовал, поскольку кажется, что вам действительно нужен список, а не словарь, вы можете в первую очередь пересмотреть использование словаря. Вы можете просто использовать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
На самом деле это неверно - см. Мой комментарий к принятому ответу.
Уинстон Смит,
Ах, я неправильно понял вопрос. Мне кажется сбивающим с толку помещать их в словарь «неправильно». Отредактирую свой ответ.
Джон Скит,
1
@JonSkeet Причина "обратной" связи заключается в том, что данные, хранящиеся в словаре в виде пары ключ / значение, обычно используют ключ (значение поиска) в качестве связи данных (например, для ссылки на базу данных) и в раскрывающемся списке , это соответствует DataValueField, то есть возвращаемому значению POST, которое сообщает вам больше о выбранном элементе, чем DataTextField, то есть отображаемое значение. (У DropDownLists просто плохое соглашение об именах)
Дэни
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
    }
};
Мэтт Фрир
источник
Upvoted. Примечательно, что НЕОБХОДИМО, чтобы это был объект на стороне сервера для оценки. Вы не можете передать его встроенным, используя <% # syntax%>. Будь то <script runat = "server"> или как видно из приведенного выше примера Мэтта, до вас. Это действительно работает.
Barry
5

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

user98296
источник