DataSourceとしてディクショナリを持つC#DropDownList


112

私は設定したいDataTextFieldDataValueFieldDropdownlist辞典(リスト)を使用して(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();

どのようにして設定することができますDataTextFieldDataValueField

回答:


205

同様に、「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();

12
TextFieldを "key"に、ValueFieldをValueに設定することをお勧めします。もっと直感的だと思います。
MGOwen、2012年

15
@MGOwen 一般的な「値」のため、DataValueFieldをValueに設定すること直感的に見えるかもしれませんが、データ構造/コントロールの通常の使用では実際には非論理的です。これの詳細については、ジョン・スキートの回答に関する私のコメントを参照してください。
ダニ

リストが表示されません。2つの引数をとるAdd .. 1つの引数をとる1つだけです。これはwinformsですか?
HRH

@hrhでは、おそらくを使用してDictionary<TKey, TValue>いませんが、おそらくList<T>
sshow

@Canavarは、DataTextフィールドを「Key-Value」として設定することは可能です....?どうすればできますか。
Sravan Kumar 2013

11

辞書が列挙されている場合、それが得られますKeyValuePair<TKey,TValue>あなただけの「価値」と「キー」に指定する必要がありますので...オブジェクトをDataTextFieldしてDataValueField選択し、それぞれの値を / Keyプロパティ。

ジョーのコメントのおかげで、私は質問を読み直してこれらを正しい方向に回しました。通常、私はディクショナリの「キー」が表示されるテキストであり、「値」がフェッチされる値であることを期待します。ただし、サンプルコードではこれらを逆に使用します。このようにする必要がない限り、次のようにコードを記述することを検討してください。

list.Add(cul.DisplayName, cod);

(そしてもちろん、「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));
}

または、プレーンな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
実際、これは正しくありません-受け入れられた回答に関する私のコメントを参照してください。
ウィンストンスミス

ああ、私は質問を誤解するでしょう。それらを「間違った」方法で辞書に入れるのは私にとって混乱しているようです。私の答えを編集します。
Jon Skeet、

1
@JonSkeet「後方」関連付けの理由は、キー/値ペアとしてディクショナリに格納されているデータが、通常、データ関連付け(たとえば、データベース参照用)およびドロップダウンリストとしてキー(ルックアップ値)を使用するためです。 、これは、DataValueField(POSTの戻り値)に対応します。これは、DataTextField(表示値)よりも選択されたアイテムについての詳細を示します。(DropDownListsの命名規則は不十分です)
Dani

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">であるか、または上記のマットの例に見られるように、あなた次第です。それは確かに機能します。
バリー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.