سؤال

وأريد أن أضع DataTextField وDataValueField من Dropdownlist (languageList) باستخدام قاموس (القائمة) من languageCod (أون-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؟

هل كانت مفيدة؟

المحلول

ومثل التي يمكنك تعيينها 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();

نصائح أخرى

وعندما يتم تعداد القاموس، وسوف تسفر 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، يمكنك الاستمرار في استخدام حلقة 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();

إذا تم تعريف دروبدوونليست في صفحة aspx وليس في codebehind، يمكنك أن تفعل ذلك من هذا القبيل.

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

ومجرد استخدام "مفتاح" و "القيمة"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top