تحديد صف الشبكة من اختيار مربع الاختيار المحبوب مع Autopostback
-
28-09-2019 - |
سؤال
لدي شبكة قاعدة بيانات مع عمود حقل تمثل يمثل خانة اختيار. عندما يقوم المستخدم بفحص خانة الاختيار ، فإنه سيقوم بتوسيع نطاق 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)
. ليس لدي أي فكرة عما إذا كان هذا سيعمل.