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

الثلاثاء، 29 أكتوبر 2013

الترتيب يمحو بعض خانات DataGridView


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

 

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

ويمكنك حل هذه المشكلة بالتأكد من ربط جميع الأعمدة بمصدر البيانات.. طبعا من غير العملي إضافة أعمدة في قاعدة البيانات Database مقابلة لهذه الأعمدة، فالبيانات التي تعرضها في الغالب تكون بيانات مستنتجة أو محسوبة أو مجرد CheckBox يؤدي وظيفة معينة، أو ترقيم أو ما شابه، ومن العبث حفظ هذه البيانات في قاعدة البيانات على حساب زيادة حجمها بلا مقابل.. فما الحل إذن؟

الحل هو إضافة خاصية جديدة في الفئة التي تمثل مصدر البيانات (مثل فئات LinQ To SQL أو الفئات الخاصة بمجوعة البيانات محددة النوع Typed DataSet).. لا تفعل هذا في الملف المولّد تلقائيا Auto Generated (الذي ينتهي اسمه بالكلمة Designer.vb أو Designer.cs) لأن أي شيء تكتبه في هذا الملف سيكون عرضة للضياع.. ولكن اضغط بزر الفأرة الأيمن على اسم الفئة في مخطط محتوى البيانات DataContext أو مجموعة البيانات DataSet، واضغط الأمر View Code لعرض الملف الخاص بامتداد هذه الفئة Partial Class، وأضف إليه خاصية عامة Public Property لتربط بها العمود الخاص بك.

لاحظ أن هذه الخاصية لن تظهر ضمن خصائص الكائن في نافذة مصادر البيانات Data Sources ولن تستطيع اختيار اسمها في نافذة الخصائص من ضمن خصائص مصدر الربط BindingSource، لكن رغم هذا ما زلت تستطيع ربط العمود بها بوضع اسمها يدويا في الخاصية DataPropertyName الخاصة به (سواء في مصمم الأعمدة أو في الكود).

الآن يمكنك ترتيب صفوف جدول العرض دون خسارة بيانات هذا العمود.

 

ملحوظة:

يؤدي ترتيب جدول العرض أيضا إلى ضياع تنسيق جميع الخانات CellStyle وعودتها إلى القيم الأساسية المحفوظة في الخاصية DataGridView.DefultCellStyle.. حل هذه المشكلة يحتاج جهدا كبيرا، لأن الخانة تأخذ تنسيقها من عدة خصائص مختلفة مثل DataGridView.RowsDefultCellStyle و DataGridViewRow.DefultCellStyle و DataGridViewCell.CellStyle

وغيرها من الخصائص التي يمكنك الحصول على تأثيرها النهائي من خلال الخاصية DataGridViewCell.InheritedCellStyle

لهذا فإن محاولة حفظ قيم كل هذه الخصائص واستعادة تنسيق كل خانة بعد ترتيب الجدول عملية معقدة، خاصة إذا كان تنسيق الخانات يتغير أثناء تنفيذ البرنامج (كتغير لون خلفية أحد الصفوف عند اختيار قيمة معينة في إحدى خاناته)!

 

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

إرسال تعليق

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

صفحة الشاعر