سؤال

لدي هذا aspx-كود:(عينة)

<asp:DropDownList runat="server" ID="ddList1"></asp:DropDownList>   

مع هذا codebehind:

List<System.Web.UI.WebControls.ListItem> colors = new List<System.Web.UI.WebControls.ListItem>();
colors.Add(new ListItem("Select Value", "0"));
colors.Add(new ListItem("Red", "1"));
colors.Add(new ListItem("Green", "2"));
colors.Add(new ListItem("Blue", "3"));
ddList1.DataSource = colors;
ddList1.DataBind();

الإخراج يبدو مثل هذا:

<select name="ddList1" id="ddList1">
    <option value="Select Value">Select Value</option>
    <option value="Red">Red</option>
    <option value="Green">Green</option>
    <option value="Blue">Blue</option>
</select>   

سؤالي هو:لماذا قيمي (أرقام) تختفي و النص كما تستخدم قيمة النص ؟ وأنا أعلم أنه يعمل إذا كنت تستخدم ddList1.Items.Add(New ListItem("text", "value")) الطريقة ولكن أنا بحاجة إلى استخدام قائمة عامة كمصدر بيانات لأسباب أخرى.

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

المحلول

لأن DataBind يربط القيم إلا إذا DataValueField يتم تعيين الخاصية.إذا قمت بتعيين DataValueField الملكية إلى "قيمة" قبل استدعاء DataBind, القيم الخاصة بك سوف تظهر على العلامات.

تحديث:سوف تحتاج أيضا إلى تعيين DataTextField الملكية إلى "نص".لأنه ربط البيانات و إضافة العناصر يدويا لا تعمل بنفس الطريقة.ربط البيانات لا تعرف وجود نوع عنصر القائمة ويولد العلامات من خلال تقييم البنود في مصدر البيانات.

نصائح أخرى

و ها هو الأسلوب الذي يؤدي ربط البيانات.يمكنك ان ترى بالضبط ما يجري:

protected internal override void PerformDataBinding(IEnumerable dataSource)
{
    base.PerformDataBinding(dataSource);
    if (dataSource != null)
    {
        bool flag = false;
        bool flag2 = false;
        string dataTextField = this.DataTextField;
        string dataValueField = this.DataValueField;
        string dataTextFormatString = this.DataTextFormatString;
        if (!this.AppendDataBoundItems)
        {
            this.Items.Clear();
        }
        ICollection is2 = dataSource as ICollection;
        if (is2 != null)
        {
            this.Items.Capacity = is2.Count + this.Items.Count;
        }
        if ((dataTextField.Length != 0) || (dataValueField.Length != 0))
        {
            flag = true;
        }
        if (dataTextFormatString.Length != 0)
        {
            flag2 = true;
        }
        foreach (object obj2 in dataSource)
        {
            ListItem item = new ListItem();
            if (flag)
            {
                if (dataTextField.Length > 0)
                {
                    item.Text = DataBinder.GetPropertyValue(obj2, dataTextField, dataTextFormatString);
                }
                if (dataValueField.Length > 0)
                {
                    item.Value = DataBinder.GetPropertyValue(obj2, dataValueField, null);
                }
            }
            else
            {
                if (flag2)
                {
                    item.Text = string.Format(CultureInfo.CurrentCulture, dataTextFormatString, new object[] { obj2 });
                }
                else
                {
                    item.Text = obj2.ToString();
                }
                item.Value = obj2.ToString();
            }
            this.Items.Add(item);
        }
    }
    if (this.cachedSelectedValue != null)
    {
        int num = -1;
        num = this.Items.FindByValueInternal(this.cachedSelectedValue, true);
        if (-1 == num)
        {
            throw new ArgumentOutOfRangeException("value", SR.GetString("ListControl_SelectionOutOfRange", new object[] { this.ID, "SelectedValue" }));
        }
        if ((this.cachedSelectedIndex != -1) && (this.cachedSelectedIndex != num))
        {
            throw new ArgumentException(SR.GetString("Attributes_mutually_exclusive", new object[] { "SelectedIndex", "SelectedValue" }));
        }
        this.SelectedIndex = num;
        this.cachedSelectedValue = null;
        this.cachedSelectedIndex = -1;
    }
    else if (this.cachedSelectedIndex != -1)
    {
        this.SelectedIndex = this.cachedSelectedIndex;
        this.cachedSelectedIndex = -1;
    }
}

إذا كنت بناء ListItems, أنت لا تحتاج إلى استخدام DataBind() في المقام الأول.

فقط إضافتها إلى DropDownList:



ddList1.Items.Add(new ListItem("Select Value", "0"));
ddList1.Items.Add(new ListItem("Red", "1"));
ddList1.Items.Add(new ListItem("Green", "2"));
ddList1.Items.Add(new ListItem("Blue", "3"));

DataBind() مفيد عندما يكون لديك بالفعل مجموعة/dataobject (عادة DataTable أو DataView) التي يمكن أن تستخدم البيانات من خلال تحديد DataTextField و DataValueField (كما buyutec كتب).

"إذا كنت بناء ListItems, أنت لا تحتاج إلى استخدام DataBind() في المقام الأول."

إضافة مباشرة إلى dropdownlist هو الطريق السهل (ونظرا سبيل المثال رمز الحق واحد) ولكن دعونا نقول لديك غير مرتبة datasource وتريد قائمة العناصر مرتبة.

طريقة واحدة لتحقيق ذلك إنشاء قائمة عامة من عنصر القائمة ومن ثم استخدام ورثت نوع الأسلوب قبل ربط البيانات إلى القائمة.

هناك العديد من wys لقطة الجلد...

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