س:
عند ربط جدول العرض DataGridView بقائمة List فإن ضغط رؤوس الأعمدة لا يؤدي إلى إعادة ترتيب الجدول.. فلماذا؟..
وكيف يمكن حل هذه المشكلة؟
ج:
عند ضغط رأس العمود لتنفيذ الترتيب التلقائي لجدول العرض تبعا لقيم هذا العمود،
يطلب جدول العرض من مصدر البيانات DataSource المرتبط به أن يقوم هو بتنفيذ عملية الترتيب تبعا للخاصية التي
يرتبط بها العمود المضغوط.. أي أن جدول العرض لا ينفذ أي شيء بنفسه.. لهذا يجب أن
يكون مصدر البيانات قابلا للترتيب IsSortable = True.. وهذا غير متوفر في القوائم Lists والمجموعات Collections ولا حتى في قائمة الربط BindingList.
وبتتبع
الأكواد التي تستخدمها ميكروسوفت في LinQ To SQL وجدت أنها تستخدم فئة خاصة اسمها SortableBindingList لتسمح بالترتيب عند عرضها في جدول العرض.. لكن الغريب أن
ميكروسوفت جعلت هذه الفئة خاصة، ولا يمكن للمبرمج استخدامها.. لهذا عليك أن تكتب
كود هذه الفئة بنفسك في مشاريعك.
وستجد
كود هذه الفئة في هذا المشروع:
واستخدامها
بسيط جدا، فهي فئة عامة Generic Type، يمكنك
أن تخصصها لأي نوع تتعامل معه من البيانات، وليس عليك أكثر من أن ترسل إلى حدث
إنشائها Constructor
القائمة التي تريد أن تمنحها إمكانية الترتيب.. وستجدنا نستخدمها في المشروع
المشار إليه على الصورة:
Dim
SortedList As New SortableBindingList(
Of PictureInfo)(Coins.PicsInfo.Values.ToList)
DataGridView1.DataSource
= SortedList
حيث:
- PictureInfo هو نوع البيانات المخزنة في القائمة، وهي فئة خاصة بي عرّفتها في
المشروع.. هذا يوضح أنك تستطيع استخدام هذه الفئة مع أي نوع، سواء كان جزءا من إطار
العمل أو خاصا بك.
- Coins.PicsInfo.Values هو
مجموعة Collection تحتوي
على عناصر من النوع PictureInfo..
ولتحويلها إلى قائمة استخدمنا الوسيلة الإضافية ToList، وهي الوسيلة التي ستستخدمها في الغالب لإرسال القائمة إلى حدث
إنشاء الفئة SortableBindingList، لتحويل
المجموعات العائدة من نتائج استعلامات LinQ إلى قوائم.
هذا
كل شيء.. بعد هذا جعلنا مجموعة الربط القابلة للترتيب مصدر بيانات جدول العرض
بإرسالها إلى الخاصية DataGridView.DataSource.. الآن يمكنك ترتيب الجدول تبعا لأي عمود فيه
بمجرد ضغط العمود بدون كتابة أي كود إضافي.
ولا
تسلني مرة أخرى لماذا لم تمنحنا ميكروسوفت هذه الإمكانية مباشرة ما دامت موجودة في
إطار العمل وقررت أن تخفيها عنا، فأنا لا أعلم!
ملحوظة:
في
الفئة SortableBindingList ستجد
أنني حولت جزءا من الكود إلى تعليق في حدث إنشاء الفئة الداخلية PropertyComparer.. هذا الجزء من
الكود سبب معي خطأ عندما كنت أتعامل مع نوع بيانات موروث من نوع آخر، لأن هذا
الكود اعتبر أن الصفات الموروثة ليست خاصة بهذا النوع!!.. وقد وجدت أنه لا ضرورة
لهذا الكود فحذفته، وعملت الفئة بعد ذلك على ما يرام!
ليست هناك تعليقات:
إرسال تعليق
ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.