تحديد صف الشبكة من اختيار مربع الاختيار المحبوب مع Autopostback

StackOverflow https://stackoverflow.com/questions/4082607

سؤال

لدي شبكة قاعدة بيانات مع عمود حقل تمثل يمثل خانة اختيار. عندما يقوم المستخدم بفحص خانة الاختيار ، فإنه سيقوم بتوسيع نطاق AUTOPOSTBACK وتحديث الصف للإشارة إلى حالة فحص المربع.

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

هل يمكن لأي شخص أن يقترح طريقة لتحديد صف مربع الاختيار الذي أطلقت حدث oncheckedChanged؟ أو هل يمكنك اقتراح طريقة أفضل لتحقيق ما أحتاج إلى فعله؟

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

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

المحلول

يمكنك العثور على خانة الاختيار التي تم فحصها عن طريق التكرار على الصفوف.

Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
    For Each row As GridViewRow In GridView1.Rows
        Dim cb As CheckBox = DirectCast(row.FindControl("MyCheckBoxID"), CheckBox)
        If sender Is cb AndAlso cb.Checked Then
            'Do something ...'
            Exit For
        End If
    Next
End Sub

هذا ليس غير فعال كما يبدو (عندما لا تكون صفحات الشبكة عالية جدًا).

يمكنك أيضًا الحصول على GridViewRow عبر checkbox.parent.parent:

  Protected Sub MyCheckBoxCheckedChanged(ByVal sender As Object, ByVal e As EventArgs)
        Dim cb As CheckBox = DirectCast(sender, CheckBox)
        Dim row As GridViewRow = DirectCast(cb.Parent.Parent, GridViewRow)
        row.BackColor = DirectCast(IIf(cb.Checked, Color.Red, Color.White), Color)
  End Sub

هذا أسرع مثل الخيار 1 ولكن إذا كنت ستشعر مربع الاختيار في جدول في المستقبل ، فلن يعمل هذا بعد الآن دون تعديل.

عادةً ما أفضّل الخيار 1 ، لأنه في معالج الأحداث لا يهم أكثر من مللي ثانية أو أقل.


تحديث: الحصول على GridViewRow عبر NamingContainer هل خيار آخر (في رأيي الأفضل):

Dim row As GridViewRow = DirectCast(cb.NamingContainer, GridViewRow)

هذا لا يزال يعمل حتى عندما تعشش مربع الاختيار داخل عناصر تحكم أخرى مثل الجدول.

نصائح أخرى

لا أعتقد أن هناك طريقة للقيام بذلك كما هو مذكور دون التعامل مع RowEditing, RowUpdating, ، و RowCancelingEdit الأحداث.

بدلاً من ذلك ، أقترح إضافة ملف CommandField إلى GridView, ، مثل ذلك:

<asp:CommandField ShowSelectButton="true" />

ستحتاج إلى التعامل مع gridview.selectedIndexChanging ، مرة أخرى مثل ذلك:

    void GridView_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
    {
        GridView.SelectedIndex = e.NewSelectedIndex;
    }

بمجرد دخولك SelectedIndexChanging, ، يمكنك استخدام GridView.Rows[e.NewSelectedIndex].FindControl("id") للحصول على السيطرة التي تحتاجها - على افتراض أن هذا الفانسيتون لا يزال أمرًا بالغ الأهمية بالنسبة لك.

يحرر: لقد قرأت للتو التحديث الخاص بك ، ولست متأكدًا تمامًا مما تحاول تحقيقه هنا. يبدو أنك على دراية بـ CommandField. ماذا تريد أن يفعل موقع الويب الخاص بك عند التحقق من خانة الاختيار هذه التي يجب القيام بها بشكل مستقل في الدول التي تنص على الصف؟

تحرير 2: يمكنك أيضا الإلقاء object sender لك CheckBox, وتجد ما هو مناسب GridRow استخدام .Parent(), ، لكن هذا شعر دائمًا بالاختراق للغاية بالنسبة لي.

تحرير 3: أقسم ، سأتوقف عن تحرير هذا في النهاية.

لم أجرب هذا أبدًا ، لكن يمكنك الحصول على إشارة إلى CheckBox.ClientID وحاول المرور بكل صف في Gridview ، والاتصال GridViewRow.FindControl(CheckBox.ClientID). ليس لدي أي فكرة عما إذا كان هذا سيعمل.

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