Veri Kaynağı Olarak Sözlüğe Sahip C # DropDownList


112

Ben ayarlamak istediğiniz DataTextFieldve DataValueFielda Dropdownlistbir Sözlüğü (liste) kullanarak (languageList) languageCodekrana metin olarak anahtar ve dil adı (ingilizce) olarak (tr-tr).

İlgili Kod:

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

Nasıl ayarlayabilirim DataTextFieldve DataValueField?

Yanıtlar:


205

Bunun gibi, "Anahtar" ve "Değer" metinlerini kullanarak DropDownList öğesinin DataTextField ve DataValueField değerini ayarlayabilirsiniz:

    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" ve ValueField'ı Value olarak ayarlamanızı öneririm. Bunun daha sezgisel olduğunu düşünüyorum.
MGOwen

15
@MGOwen Ortak "Değer" nedeniyle DataValueField'ı Değere ayarlamak sezgisel görünebilir , ancak veri yapısının / kontrolünün düzenli kullanımında aslında mantıksızdır. Bununla ilgili ayrıntılar için, Jon Skeet'in cevabı hakkındaki yorumuma bakın.
Dani

Bir liste görmüyorum. 2 argüman alan ekle .. sadece bir argüman alan biri. bu winforms mu?
saat

@hrh o zaman muhtemelen a kullanmıyorsunuz Dictionary<TKey, TValue>, ama belki a List<T>.
47'de göster

@Canavar, DataText alanını "anahtar-değer" olarak ayarlamak mümkün mü ....? Nasıl yapabilirim.
Sravan Kumar

11

Bir sözlük sayılan zaman, verecektir KeyValuePair<TKey,TValue>sadece "Değerini" ve "Anahtar" vermek zorunda yani ... nesneleri DataTextFieldve DataValueFieldseçmek için sırasıyla Değer / Anahtar özellikler.

Joe'nun yorumu sayesinde, bunları doğru şekilde almak için soruyu tekrar okudum. Normalde, sözlükteki "anahtar" ın görüntülenen metin olmasını ve "değer" in getirilen değer olmasını beklerdim. Örnek kodunuz onları tam tersi şekilde kullanır. Bu şekilde olmaları için gerçekten ihtiyacınız olmadıkça, kodunuzu şu şekilde yazmayı düşünebilirsiniz:

list.Add(cul.DisplayName, cod);

(Ve sonra bağlamayı değiştirerek elbette "Anahtar" DataTextFieldve "Değer" kullanmak için DataValueField.)

Aslında, bir sözlük yerine gerçekten bir liste istediğiniz gibi göründüğü için, ilk başta bir sözlük kullanmayı yeniden düşünmek isteyebileceğinizi öneririm . Şunu kullanabilirsiniz 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));
}

Alternatif olarak, bir düz CultureInfodeğerler listesi kullanın . LINQ, bunu gerçekten kolaylaştırır:

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

LINQ kullanmıyorsanız, yine de normal bir foreach döngüsü kullanabilirsiniz:

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
Aslında bu yanlış - kabul edilen cevap hakkındaki yorumuma bakın.
Winston Smith

Ah, soruyu yanlış anlardım. Bunları bir sözlüğe "yanlış" şekilde yerleştirmek bana kafa karıştırıcı geliyor. Cevabımı düzenleyecek.
Jon Skeet

1
@JonSkeet "Geriye doğru" ilişkilendirmenin nedeni, sözlükte anahtar / değer çifti olarak depolanan verilerin normalde anahtarı (arama değeri) bir veri ilişkilendirmesi olarak (örneğin, veritabanı referansı için) ve bir açılır listede kullanmasıdır. Bu, DataValueField'e, yani seçilen öğe hakkında DataTextField'den, yani görüntü değerinden daha fazlasını söyleyen bir POST'un dönüş değerine karşılık gelir . (DropDownListelerinde kötü bir adlandırma kuralı var)
Dani

6

DropDownList, kodun arkasında değil de aspx sayfanızda bildirilmişse, bunu şu şekilde yapabilirsiniz.

.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. Bunun değerlendirilmesi için sunucu tarafı bir nesne olması ZORUNLU olması dikkat çekicidir. Bunu satır içi olarak <% # sözdizimi%> kullanarak geçiremezsiniz. Bunun bir <script runat = "server"> olması veya Matt'in yukarıdaki örneğinde görüldüğü gibi, size kalmış. Gerçekten işe yarıyor.
Barry

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.