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?

Відповіді:


205

Так, ви можете встановити 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();

12
Я рекомендую встановити TextField на "ключ", а ValueField на значення. Я думаю, що це більш інтуїтивно.
MGOwen

15
@MGOwen Може здатися інтуїтивно зрозумілим значення DataValueField у значення через загальне "Значення", але воно є нелогічним при регулярному використанні структури / контролю даних. Детальніше про це дивіться у моєму коментарі до відповіді Джона Скіта.
Дані

Я не бачу списку. Додайте, що займає 2 аргументи .. лише один, який займає один аргумент. це winforms ??
ч.

@hrh, то, ймовірно, ви не використовуєте Dictionary<TKey, TValue>, але, можливо, а List<T>.
sshow

@Canavar чи можна встановити поле DataText як "ключ-значення" ....? Як я можу це зробити.
Sravan Kumar

11

Коли словник перераховується, це дасть KeyValuePair<TKey,TValue>об'єкти ... так що вам просто потрібно вказати значення «Value» і «ключ» для DataTextFieldі , DataValueFieldвідповідно, для вибору Value / Основні властивості.

Завдяки коментарю Джо, я перечитав питання, щоб правильно їх вирішити. Зазвичай я очікую, що "ключем" у словнику буде текст, що відображається, а "значення" - отримане значення. Ваш зразок-код використовує їх навпаки. Якщо ви дійсно не потребуєте їх таким чином, ви можете розглянути можливість написання коду як:

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();

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

Отримано. Примітно, що ПОТРІБНО, щоб це був серверний об'єкт, який слід оцінювати. Ви не можете передати його вбудованому, використовуючи <% # синтаксис%>. Будь то <script runat = "server"> або, як видно з прикладу Метта вище, до вас. Це дійсно працює.
Баррі

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.