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

الاثنين، 18 نوفمبر 2013

التضارب في ربط البيانات


س: أستخدم ربط البيانات DataBindings لربط التاريخ الذي تعرضه الأداة DateTimePicker بمصدر ربط BindingSource.. لكن مشكلة غريبة تحدث عند تغيير التاريخ في الأداة DateTimePicker والانتقال إلى أداة أخرى على النافذة وتغيير قيمتها ثم ضغط الزر Tab لمغادرتها، ففي هذه اللحظة يعود التاريخ الذي تعرضه الأداة DateTimePicker إلى قيمته الأصلية قبل التغيير!.. فكيف يمكن حل هذه المشكلة؟

 

ج: من الواضح أن كائن ربط البيانات Binding Object لم ينقل التاريخ الجديد الذي تم اختياره في الأداة DateTimePicker إلى كائن مصدر الربط BindingSource عند مغادرة الأداة، وأن تغيير قيمة الأداة الأخرى ثم مغادرتها أدى إلى تحديث بيانات مصدر الربط، فقام بدوره بتحديث التاريخ في الأداة DateTimePicker فعاد إلى قيمته الأولى!

من ملاحظاتي، فإن هذا الخطأ يحدث في الأدوات المرتبطة بمصدر ربط، عندما تكتب كودا في حدث تغير قيمة الأداة (مثل الحدث DateTimePicker.ValueChanged) تقوم فيه بتحديث قيم أدوات أخرى مرتبطة بنفس مصدر الربط.. هنا يحدث التضارب، لأن أداة اختيار التاريخ لم تنقل قيمتها الجديدة لمصدر الربط، بينما قامت بتغيير قيم أدوات أخرى حدّثت بيانات مصدر الربط الذي ما زال لا يرى إلا القيمة القديمة للتاريخ!.. لهذا يمكن أن يتكرر مثل هذا الخطأ في أدوات أخرى مثل NumericUpDown وغيرها.

ولحل هذه المشكلة، يجب ألا تكتب أي كود في حدث تغير قيمة الأداة ValueChanged.. أحيانا لا يكون الحل ممكنا، لهذا يمكنك استخدام حل أفضل، وهو إجبار كائن الربط على إرسال التاريخ الجديد إلى مصدر الربط بعد تغييره مباشرة.. أسهل طريقة لفعل هذا هي جعل القيمة تنتقل بمجرد تغير الخاصية DateTimePicker.Value بدلا من نقل القيمة بعد إجازة البيانات Validation (وهو التصرف الافتراضي لكائن الربط).. إذا كنت تستخدم الكود في عملية الربط، فعدله ليكون كالتالي:

DateTimePicker1.DataBindings.Add(New Binding(

         "Value", BindingSource1, "Date", True,

          DataSourceUpdateMode.OnPropertyChanged))

أما إذا كنت تستخدم نافذة الخصائص، فحدد الأداة DateTimePicker1 على النافذة، واضغط F4 لعرض نافذة الخصائص، وفيها أسدل الخصائص الفرعية للعنصر (DataBindings) واضغط الزر الموجود في خانة العنصر (Advanced)، وفي النافذة التي ستظهر اختر الخاصية Value من قائمة الخصائص، ومن القائمة المنسدلة المعنونة بـ Data Source Update Mode اختر القيمة OnPropertyChanged، واضغط OK.

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

 

ملحوظة:

نقل التاريخ إلى مصدر الربط فور اختيار المستخدم له، يعتبر تصرفا جيدا عليك باتباعه دائما، فأنت لا تحتاج إلى إجازة البيانات Validation هنا فلا يمكن للمستخدم أن يكتب قيمة خاطئة في الأداة DateTimePicker، خاصة إذا ضبطت قيمتي الخاصيتين MinDate و MaxDate لمنعه من اختيار أي تاريخ خارج نطاق التواريخ المناسب لوظيفة برنامجك.

 

 

 

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

إرسال تعليق

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

صفحة الشاعر