سؤال

هل من الممكن أن DataBind أحد ASP.NET CheckBoxList هذه سلسلة قيمة في البيانات يصبح التسمية من مربع الاختيار و منطقي قيمة الشيكات/unchecks الصندوق ؟

على asp.net يبفورم لدي CheckBoxList مثل هذا:

<asp:CheckBoxList runat="server" ID="chkListRoles" DataTextField="UserName" DataValueField="InRole" />

في التعليمات البرمجية خلف لدي هذا الكود:

var usersInRole = new List<UserInRole> 
{ 
  new UserInRole { UserName = "Frank", InRole = false},
  new UserInRole{UserName = "Linda", InRole = true},
  new UserInRole{UserName = "James", InRole = true},
};

chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();

كنت آمل أن خانات الاختيار سيتم فحص عند InRole = true.لقد حاولت أيضا InRole = "فحص".وكانت النتائج نفسها.أنا لا يمكن أن يبدو للعثور على طريقة DataBind و التلقائى لديك خانات الاختيار التحقق من/دون رادع.

حاليا أنا في حل المشكلة من خلال وضع مختارة = true للعناصر المناسبة في DataBound الحدث.يبدو ان هناك نظافة الحل فقط في متناول يدي

شكرا لك

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

المحلول

تحرير: ليس هناك طريقة للقيام بذلك من خلال العلامات.على DataValueField لا تحدد ما إذا كانت خانة الاختيار البند هو الاختيار أو لا.فإنه يسترد أو يخزن قيمة لاستخدامها في postbacks.على DataValueField هو شائع في جميع أنحاء CheckBoxLists, RadioButtonLists, ListControl ، إلخ.

هذا هو السبيل الوحيد إلى ما قبل تحديد خانات الاختيار كما كنت وجدت بالفعل.

chkListRoles.DataSource = usersInRole;
chkListRoles.DataBind();

foreach(ListItem item in chkListRoles.Items)
 item.Selected = usersInRole.Find(u => u.UserName == item.Text).InRole;

نصائح أخرى

أنا جعلت عنصر تحكم مخصص لهذا ، بعد الحصول على تعبت من OnItemDataBound-ملزمة.وسوف تتيح لك ربط Selected السمة.يمكنك بسهولة جعل نفس التحكم RadioButtonList عن طريق تغيير ما التحكم المخصصة مستمد من.

استخدام هذا ببساطة إضافة DataCheckedField السمة عند إنشاء عنصر التحكم في العلامات.تذكر للإشارة إلى عناصر التحكم المخصصة في ويب.التكوين الملف.

العلامات

<myControls:SimpleCheckBoxList runat="server" ID="chkListRoles"
                               DataCheckedField="InRole"
                               DataTextField="UserName"
                               DataValueField="UserId" />

رمز التحكم

public class SimpleCheckBoxList : System.Web.UI.WebControls.CheckBoxList
{
    public string DataCheckedField
    {
        get
        {
            string s = (string)ViewState["DataCheckedField"];
            return (s == null) ? String.Empty : s;
        }
        set
        {
            ViewState["DataCheckedField"] = value;
            if (Initialized)
                OnDataPropertyChanged();
        }
    }

    protected override void PerformDataBinding(IEnumerable dataSource)
    {
        if (dataSource != null)
        {
            if (!this.AppendDataBoundItems)
                this.Items.Clear();

            if (dataSource is ICollection)
                this.Items.Capacity = (dataSource as ICollection).Count + this.Items.Count;

            foreach (object dataItem in dataSource)
            {
                ListItem item = new ListItem()
                {
                    Text = DataBinder.GetPropertyValue(dataItem, DataTextField).ToString(),
                    Value = DataBinder.GetPropertyValue(dataItem, DataValueField).ToString(),
                    Selected = (DataCheckedField.Length > 0) ? (bool)DataBinder.GetPropertyValue(dataItem, DataCheckedField) : false
                };
                this.Items.Add(item);
            }
        }
    }
}

وليس من الممكن استخدام الترميز. ما يمكنك القيام به هو ربط checkboxlist انك تريد أن تعمل - مع منطقي في DataValueField، ثم ببساطة إضافة هذا كما حدث OnDataBound.

protected void myCheckBoxList_DataBound(object sender, EventArgs e)
    {
        foreach (ListItem item in myCheckBoxList.Items)
        {
            item.Selected = bool.Parse(item.Value);
        }
    }

والفرق بين هذا الحل والذي اقترحه خوسيه باسيليو هو أن هذا واحد يعمل مع كل نوع من أساليب ربط البيانات. على سبيل المثال ملزمة مع SelectMethod باستخدام ميزة ModelBinding جديدة في V4.5.

وأود أن تعتقد أنك يجب أن نقول للسيطرة ما الخاصية لربط ل... في هذه الحالة "InRole".

ولقد لعبت مع حولها ويبدو أن هناك قطعا لربط اختيار مربع، عليك أن تفعل ذلك بنفسك. وكنت قادرا على ربط النص وقيم المرجعية التي يبدو فقط للتعامل مع تسمية كل خانة في القائمة.

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