डेटा स्रोत के रूप में एक शब्दकोश के साथ सी # ड्रॉपडाउनलिस्ट


112

मैं सेट करना चाहते हैं DataTextFieldऔर DataValueFieldएक की Dropdownlist(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();

मैं कैसे निर्धारित कर सकते हैं DataTextFieldऔर DataValueField?

जवाबों:


205

जैसे कि आप "की" और "वैल्यू" का उपयोग करके ड्रॉपडाउनलिस्ट का डेटाटेक्स्टफिल्ड और डेटावैल्यूफिल्ड सेट कर सकते हैं:

    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
मैं "कुंजी" और वैल्यू के लिए ValueField को TextField सेट करने की सलाह दूंगा। मुझे लगता है कि यह अधिक सहज है।
MGOwen

15
@MGOwen सामान्य "मान" के कारण, DataValueField को मान पर सेट करना सहज प्रतीत हो सकता है , लेकिन यह वास्तव में डेटास्ट्रक्चर / नियंत्रण के नियमित उपयोग में अतार्किक है। इस पर विवरण के लिए, जॉन स्कीट के उत्तर पर मेरी टिप्पणी देखें।
दानी

मुझे कोई सूची दिखाई नहीं दे रही है। इसके लिए 2 args लगते हैं .. केवल एक arg लेता है। क्या यह जीत है ??
17

@ तो आप शायद का उपयोग नहीं कर रहे हैं Dictionary<TKey, TValue>, लेकिन शायद एक List<T>
sshow

@ कनवर क्या डेटाटेक् फ़ील्ड को "की-वैल्यू" के रूप में सेट करना संभव है ....? मैं यह कैसे कर सकता हूं।
श्रवण कुमार

11

जब एक शब्दकोश प्रगणित है, यह निकलेगा KeyValuePair<TKey,TValue>वस्तुओं ... इसलिए तुम सिर्फ "मान" और के लिए "कुंजी" निर्दिष्ट करने की आवश्यकता DataTextFieldहै और DataValueFieldचयन करने के लिए क्रमश: मूल्य / कुंजी गुण।

जो की टिप्पणी के लिए धन्यवाद, मैं इन सवालों को सही तरीके से प्राप्त करने के लिए फिर से लिखता हूं। आम तौर पर मैं शब्दकोश में प्रदर्शित होने वाले पाठ में "कुंजी" की अपेक्षा करता हूं और प्रदर्शित मूल्य "मूल्य" होता है। आपका नमूना कोड उन्हें दूसरे तरीके के दौर का उपयोग करता है। जब तक आपको वास्तव में इस तरह से उनकी आवश्यकता नहीं है, तब तक आप अपना कोड लिखने पर विचार कर सकते हैं:

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 का उपयोग नहीं कर रहे हैं, तो आप अभी भी एक सामान्य फ़ॉरेस्ट लूप का उपयोग कर सकते हैं:

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

अगर ड्रॉपडाउनलिस्ट आपके एस्पेक्स पेज में घोषित किया गया है और कोडबेहैंड में नहीं है, तो आप इसे इस तरह से कर सकते हैं।

.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। यह उल्लेखनीय है कि यह आवश्यक है कि इसका मूल्यांकन किया जाने वाला सर्वर-साइड ऑब्जेक्ट हो। आप <% # वाक्य रचना%> का उपयोग करके इसे इनलाइन पास नहीं कर सकते। चाहे वह <script runat = "server"> हो, या जैसा कि ऊपर मैट के उदाहरण में देखा गया हो, आपके ऊपर। यह वास्तव में काम करता है।
बैरी

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.