[مقال] Notify Collection Changed - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم لغة الفيجوال بيسك VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=182) +--- قسم : قسم مقالات VB.NET (http://vb4arb.com/vb/forumdisplay.php?fid=184) +--- الموضوع : [مقال] Notify Collection Changed (/showthread.php?tid=13692) |
Notify Collection Changed - silverlight - 02-11-15 السلام عليكم ورحمة الله وبركاته كيف يمكن عمل Enumerate لأي Collection بحيث عندما نقوم بحذف أو عندما نقوم بإضافة عناصر الي هذه Collection يتم عمل Update لواجهة التطبيق بشكل أتوماتيكي ..... بصراحة السؤال هنا قد يكون غير واضحا و ربما لا يكون مفهوما للبعض علي الإطلاق لذلك من الأفضل أن نصنع مثالا أو نكتب كودا بسيطا لتوضيح المغزي من السؤال و كيفية الإجابة عليه 1-: لنفنح مشروع ثم نضيف الي الفورم ListBox و عدد إثنان Button هذا الفورم بالاضافة الي الكونترول الموجودة به هو ما يمكن أن نطلق عليه واجهة التطبيق 2-: نقوم بتعريف Collection وهنا سوف استخدم Generic ObservableCollection و طبقا لموقع MSDN الخاص بشركة مايكروسوفت سيتضح لنا أن هذه Collection قد تكون مصممة للاستخدام مع WPF و ليس مع الويندوز فورم ..... لكن و بشكل عام هذا لن يمنعنا إطلاقا من استخدامها مع الويندوز فورم لأنها بالنهاية مثلها مثل أي Collection اخري ..... وعلي العموم فإن مايكروسوفت تنصح بإستخدام Generic BindingList[/url] أو Generic List او Generic Collection 3-: في الحدث Load الخاص ب الفورم نقوم ب تعبئة Collection ببعض String مثلا 4-: نقوم بإضافة Handler لكي نطلق الحدث CollectionChanged 5-: نقوم بتعبئة ListBox الموجودة علي الفورم ب البيانات الموجودة داخل Collection 6-: في الحدث Click الخاص بالباتون رقم 1 نحاول ان نحذف Item من Collection 7-: في الحدث Click و الخاص بالباتون رقم 2 نحاول ان نضيف Item جديدة الي Collection 8-: في الكود الخاص بالحدث CollectionChange نقوم بإعلام ListBox أن هناك بعض التغييرات قد حدثت داخل Collection و من ثم و باستخدام Collection نقوم بتعبئة هذا ListBox بالبيانات في الكود التالي ستجدون الكود الكامل للخطوات السابقة كود : Public Class Form1 الأن قم بتجربة المشروع لتري ماذا سيحدث عندما تقوم بحذف او اضافة عنصر معين من Collection كنوع من التمرين .... حاول أن تستخدم Generic BindingList بدلا من Generic ObservableCollection ستجد انها سوف تعطيك نفس النتائج الأن نأتي للهدف من المقال و لنسأل انفسنا هذه الاسئلة البسيطة: 1-: لماذا كل Generic Collection الموجودة في الدوت نت لا تدعم نفس الأسلوب ? مثلا Generic HashSet و Generic List لا تدعمان هذا الأسلوب المستخدم مع Generic ObservableCollection الاجابة علي هذا السؤال عند مايكروسوفت و للأسف انا ليس لدي اجابة واضحة بل علي العكس كثرة Generic Collection يصيبني أحيانا بنوع من عدم الفهم فأحيانا لا استطيع ان احدد متي استخدم هذه Collection او متي استخدم Collection أخري مختلفة و هنا غالبا ما اقوم بقراءة التفاصيل الخاصة بكل Collection لأفهمها بشكل معقول يساعدني علي استخدامها في احد مشروعاتي 2:- هل استطيع ان اقوم باستخدام نفس الاسلوب مع اي Generic Collection او مع اي Collection عادية؟ نعم تستطيع استخدام نفس الاسلوب لكن يجب ان يكون لديك فهم بكيفية بناء EventArgs و كيفية بناء EventHandler بل تستطيع ان يكون لديك اسلوبك الخاص لبناء مصفوفات مشابهة خاصة أن هذا الأسلوب يوفر علي المبرمج الكثير من الوقت و الجهد 3:- كيف اصمم أو كيف أقوم بتطوير بعض Generic Colletion لأجعلها تدعم نفس الاسلوب؟ هذا السؤال سنجيب عليه في المشاركة التالية المراجع: [url=https://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged%28v=vs.110%29.aspx]INotifyCollectionChanged Generic List Generic ObservableCollection NotifyCollectionChangedAction NotifyCollectionChangedEventArgs Generic HashSet Generic BindingList تقبلوا تحياتي اخوكم عمر RE: Notify Collection Changed - الشاكي لله - 02-11-15 بارك الله فيك اخوي عمر لفتة رائعة منك لكن السؤال هنا . في WPF انت لست بحاجة الى عمل Handler لحدث collection changed مما يعني انك لست بحاجة الى دالة تقوم بعمل لووب لاضافة العناصر عند كل تحديث (اقصد دالة FillListbox) لان الbinding في wpf يتكفل بموضوع التحديث أوتوماتيكيا .. فهل يمكن عمل ذلك فيWinForm؟ لان اللوب ممكن يتاخر لو كانت البيانات كبيرة RE: Notify Collection Changed - silverlight - 02-11-15 السلام عليكم ورحمة الله وبركاته في هذه المشاركة سنوضح كيفية بناء l Generic Listو كيفية بناء مصفوفة من النوع Generic تدعم نفس الأسلوب اعلاه أي اننا هنا سنجعل المصفوفة الجديدة تعلم متي يحدث حذف عنصر منها و متي يحدث إضافة عنصر جديد لها و لسوف أطلق عليها ObservableList حيث سنقوم بتوريث Generic List لها اي ان أساس المصفوفة الجديدة سيكون Generic List و الشكل المبدئي للمصفوفة الجديدة سيكون كالتالي : كود : Public Class ObservableList(Of T) الأن لنحدد نوعية التغييرات التي نحتاجها عندما تتغير هذه Collection و هي ستكون عبارة عن Enum و هنا نحن نحتاج فقط أن نعرف متي سيجدث اضافة أو متي سوف يحدث جذف بيانات من Collection الجديدة كود : Public Enum ObservableChangeAction الأن نحتاج لكتابة الكلاس ObservableEventArgs كود : Public Class ObservableEventArgs الأن لنقوم بالتعديل علي الكلاس الخاص بالمصفوفة و نضيف لها Handler و نمرر له الكلاس ObservableEventArgs ثم نكتب الكود الخاص باطلاق الحدث الخاص به فيكون شكل الكلاس بعد التعديل كالتالي: كود : Public Class ObservableList(Of T) و بما أننا نحتاج فقط الي أن تكون المصفوفة لديها دراية بعمليات الحذف و الاضافة عند حدوثها لذلك فنحن هنا لا نحتاج سوي انا نقوم باطلاق الحدث الذي يخبرنا ان المصفوفة تغيرت و هذا سيتم بعمل OverLoad لكل من Add Method و Remove Method فقط و هنا أيضا نحن في حاجة أن نتأكد ان العنصر المراد حذفه موجود بالفعل في المصفوفة و أيضا نحتاج ان نتاكد أن العنصر المراد اضافته ليس موجودا بالفعل داخل المصفوفة و لنفعل ذلك نحتاج الي قراءة جميع العناصر الموجودة في المصفوفة و من ثم نقارنها بالعنصر المراد حذفه او المراد اضافته و من ثم نحذف هذا العنصر او نضيفه للمصفوفة و بهذ سيكون الشكل النهائي للكلاس كالتالي: كود : Public Class ObservableList(Of T) الأن لنعطي مثالا لكيفية استخدام المصفوفة الجديدة و هنا سوف اقوم باستخدام نفس فكرة المثال الذي تم استخدامه في بداية المقال كود : Public Class Form1 الخلاصة: من كل ما سبق هو ان هذا الأسلوب قد وفر لي الكثير من الجهد و الوقت و علي ما أعتقد أن هنا تكمن اهمية المصفوفات الجديدة التي تكتبها مايكروسوفت و لمزيد من المصفوفات ..... قمت بإتباع نفس الاسلوب و كتابة مصفوفة أخري و لكنها موروثة من Generic HashSet و الكود الخاص بهذه المصفوفة سيكون كالتالي كود : Public Class ObservableHashSet(Of T) تمرين : حاول تستخدم Generic ObservableHashSet في المثال اعلاه و ستحصل علي نفس النتائج في المرفقات ستجدون الكود بتسخة الفيجوال استوديو 2012 تقبلوا تحياتي أخوكم عمر أخي الفاضل الشاكي لله هذا كان مجرد مثالا لتوضيح الأمر لا غير و حتي الأن لم أحاول ان اقوم بعمل Binding للكلاسات الجديدة مع اي كونترول عموما ساحاول ان ادرس الامر لاحقا و لسوف أبلغك بما حدث معي RE: Notify Collection Changed - الشاكي لله - 02-11-15 ^_^ نعم ارجو ان تخبرنا بطريقة عمل biniding بين الكلاس وبين الكونترولز موفق |