المتابعون للمدونة

الأربعاء، 9 أكتوبر 2013

DataGridViewCheckBoxColumn


س: في جدول عرض البيانات DataGridView، إذا استخدمت عمودا من النوع DataGridViewCheckBoxColumn.. كيف يمكنني أن أعرف أن المستخدم غير حالة الاختيار Checked في أي خانة في هذا العمود؟

 


ج: عندما يضغط المستخدم مربع الاختيار في أي خانة في هذا العمود، ينطلق الحدث DataGridView.CellContentClick الخاص بجدول العرض.. في هذا الحدث افعل ما يلي:

- تأكد أن الخاصية e.ColumnIndex تشير إلى رقم العمود DataGridViewCheckBoxColumn، لأن هذا الحدث ينطلق عند ضغط خانات أعمدة من أنواع أخرى.

- احصل على الخانة الحالية التي تسببت في إطلاق هذا الحدث باستخدام الخاصية DataGridView.CurrentCell.. أو يمكنك استخدام التعبير التالي للحصول على هذه الخانة (افترض أن اسم جدول العرض Dgv):

Dim Cell = Dgv.Rows(e.RowIndex).Cells(e.ColumnIndex)

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

- لا تستخدم الخاصية Cell.Value لمعرفة قيمة الخانة، فهي لا تتغير إلا بعد مغادرة الصف الذي توجد فيه في جدول العرض!!.. الخدعة هنا هي استخدام الخاصية Cell.EditedFormattedValue بدلا منها:

If CBool(Cell.EditedFormattedValue) then

    MsgBox("تم اختيار هذه الخانة")

End If

عامة، من خلال تجاربي البائسة من العمود من النوع DataGridViewCheckBoxColumn، اكتشفت أن الحدث CellContentClick قد لا ينطلق دائما عند ضغط مرب الاختيار في خانات هذا العمود، وكذلك الحال مع الحدث CellValueChanged (فكما قلنا فإن الخانة لا تحدث قيمتها إلا بعد مغادرة الصف)!!.. كما أني حاولت أن أستخدم معالجا للحدث CheckedChanged الخاص بمربع الاختيار CheckBox الموجود في هذه الخانة، ولكن لم أستطع، لأن هذه الخانات لا تتسبب في إطلاق الحدث DataGridView.EditingControlShowing!

لهذا نصيحتي في هذا الأمر هي:

إذا كان العمود DataGridViewCheckBoxColumn مرتبطا بمصدر بيانات، فليس عليك أن تقلق بشأنه، فهو سيحدث سجلات مصدر البيانات DataSource بطريقة صحيحة طبقا للخانات التي اختارها المستخدم أو أزال منها الاختيار.. أما إذا لم يكن هذا العمود مرتبطا بمصدر بيانات، وكان عليك أداء وظيفة معينة تبعا لقيم خاناته، فالحل الأسهل والأضمن هو أن تنفذ هذه الوظيفة مرة واحدة في إجراء اسمه SaveChanges مثلا، يتم استدعاؤه عندما يضغط المستخدم زر الحفظ، أو عندما يحاول إغلاق النافذة وتسأله إن كان يريد حفظ التغييرات.. في هذا الإجراء كل ما ستفعله هو المرور عبر كل صفوف جدول العرض، وفحص قيمة كل خانة في هذا العمود (افترض أنه العمود رقم I)، واتخاذ الفعل المناسب تبعا لحالتها، على الصيغة:

Dgv.EndEdit()

For Each Row As DataGridViewRow In Dgv.Rows

       If CBool(Row.Cells(I).Value) Then

           ' الوظيفة الخاصة بكون الخانة مختارة

       Else

           ' الوظيفة الخاصة بكون الخانة غير مختارة

       End If

Next

 

لاحظ استدعاءنا للوسيلة EndEdit في بداية الكود لإنهاء تحرير أي خانة ما زالت في وضع التحرير.

 

 

 

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر