C # DropDownList dengan Kamus sebagai Sumber Data

112

Saya ingin mengatur DataTextFielddan DataValueFielddari Dropdownlist(daftar bahasa) menggunakan Kamus (daftar) dari languageCod(en-gb) sebagai kunci dan nama bahasa (bahasa Inggris) sebagai teks untuk ditampilkan.

Kode yang Relevan:

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

Bagaimana cara mengatur DataTextFielddan DataValueField?

VansFannel
sumber

Jawaban:

205

Seperti itu, Anda dapat menyetel DataTextField dan DataValueField dari DropDownList menggunakan teks "Key" dan "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();
Canavar
sumber
12
Saya akan merekomendasikan pengaturan TextField ke "key" dan ValueField ke Value. Saya pikir itu lebih intuitif.
MGOwen
15
@MGOwen Mungkin tampak intuitif untuk mengatur DataValueField ke Value, karena "Value" yang umum, tetapi sebenarnya tidak logis dalam penggunaan reguler struktur data / kontrol. Untuk detailnya, lihat komentar saya atas jawaban Jon Skeet.
Dani
Saya tidak melihat daftar. Tambahkan yang membutuhkan 2 argumen .. hanya satu yang membutuhkan satu argumen. apakah ini winforms ??
jam
@hrh maka Anda mungkin tidak menggunakan Dictionary<TKey, TValue>, tapi mungkin a List<T>.
sshow
@ Canavar apakah mungkin untuk menyetel bidang DataText sebagai "nilai-kunci" ....? Bagaimana saya bisa melakukannya.
Sravan Kumar
11

Ketika kamus disebutkan, itu akan menghasilkan KeyValuePair<TKey,TValue>objek ... jadi Anda hanya perlu menentukan "Nilai" dan "Kunci" untuk DataTextFielddan DataValueFieldmasing - masing, untuk memilih properti Nilai / Kunci .

Terima kasih atas komentar Joe, saya membaca ulang pertanyaan untuk mendapatkan jawaban yang benar. Biasanya saya mengharapkan "kunci" dalam kamus menjadi teks yang ditampilkan, dan "nilai" menjadi nilai yang diambil. Kode sampel Anda menggunakannya dengan cara lain. Kecuali jika Anda benar-benar membutuhkannya seperti ini, Anda mungkin ingin mempertimbangkan untuk menulis kode Anda sebagai:

list.Add(cul.DisplayName, cod);

(Dan tentu saja, mengubah pengikatan menjadi menggunakan "Kunci" DataTextFielddan "Nilai" untuk DataValueField.)

Sebenarnya, saya menyarankan karena sepertinya Anda benar-benar menginginkan daftar daripada kamus, Anda mungkin ingin mempertimbangkan kembali menggunakan kamus sejak awal. Anda bisa menggunakan 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));
}

Alternatifnya, gunakan daftar CultureInfonilai biasa . LINQ membuatnya sangat mudah:

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

Jika Anda tidak menggunakan LINQ, Anda masih dapat menggunakan foreach loop normal:

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();
Jon Skeet
sumber
3
Sebenarnya, ini salah - lihat komentar saya tentang jawaban yang diterima.
Winston Smith
Ah, saya salah membaca pertanyaan itu. Tampaknya membingungkan bagi saya untuk memasukkannya ke dalam kamus dengan cara yang "salah". Akan mengedit jawaban saya.
Jon Skeet
1
@JonSkeet Alasan asosiasi "mundur" adalah bahwa data yang disimpan dalam kamus sebagai pasangan kunci / nilai biasanya menggunakan kunci (nilai pencarian) sebagai asosiasi data (misalnya untuk referensi database), dan dalam daftar dropdown , ini sesuai dengan DataValueField, yaitu nilai kembalian POST, yang memberi tahu Anda lebih banyak tentang item yang dipilih daripada DataTextField, yaitu nilai tampilan. (DropDownLists hanya memiliki konvensi penamaan yang buruk)
Dani
6

Jika DropDownList dideklarasikan di halaman aspx Anda dan bukan di codebehind, Anda dapat melakukannya seperti ini.

.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
    }
};
Matt Frear
sumber
Suara positif. Perlu dicatat bahwa DIBUTUHKAN bahwa ini adalah objek sisi server untuk dievaluasi. Anda tidak dapat meneruskannya secara sebaris menggunakan <% # syntax%>. Apakah itu <script runat = "server">, atau seperti yang terlihat pada contoh Matt di atas, terserah Anda. Itu memang berhasil.
Barry
5

Cukup gunakan "Kunci" dan "Nilai"

pengguna98296
sumber