تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
[مقال] Notify Collection Changed
#1
السلام عليكم ورحمة الله وبركاته

كيف يمكن عمل 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

   ' نقوم بتعريف المصفوفة
   Private myCollection As System.Collections.ObjectModel.ObservableCollection(Of String) = New System.Collections.ObjectModel.ObservableCollection(Of String)

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       ' نقوم بتعبئة المصفوفة
       Me.myCollection.Add("Omar")
       Me.myCollection.Add("Amin")
       Me.myCollection.Add("Ibrahim")

       ' نقوم بإضافة Handler
       AddHandler myCollection.CollectionChanged, New System.Collections.Specialized.NotifyCollectionChangedEventHandler(AddressOf OnCollectionChanged)
       ' نقوم بتعبئة البيانات في الليست بوكس
       Me.FillListBox()

   End Sub

   ' لنعيد تعبئة الليست بوكس بالبيانات من المصفوفة عندما يحدث حذف او اضافة
   Private Sub OnCollectionChanged(sender As Object, e As System.Collections.Specialized.NotifyCollectionChangedEventArgs)
       Me.FillListBox()
   End Sub

   '  نملا الليست بوكس بالبيانات الموجودة في المصفوفة
   Private Sub FillListBox()
       Me.ListBox1.Items.Clear()
       For Each s As String In myCollection
           Me.ListBox1.Items.Add(s)
       Next
   End Sub

   ' لنحاول حذف احد البيانات من المصفوفة
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       Dim item As String = "Ibrahim"
       If Me.myCollection IsNot Nothing Then
           Me.myCollection.Remove(item)
       End If
   End Sub

   ' لنحاول اضافة عنصر جديد الي المصفوفة
   Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
       Dim item As String = "Mahmoud"
       If Not myCollection.Contains(item) Then
           Me.myCollection.Add(item)
       End If

   End Sub

End Class

الأن قم بتجربة المشروع لتري ماذا سيحدث عندما تقوم بحذف او اضافة عنصر معين من 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


تقبلوا تحياتي
اخوكم عمر
الرد }}}
تم الشكر بواسطة: khodor1985 , khodor1985 , الشاكي لله


الردود في هذا الموضوع
Notify Collection Changed - بواسطة silverlight - 02-11-15, 04:25 PM
RE: Notify Collection Changed - بواسطة الشاكي لله - 02-11-15, 05:00 PM
RE: Notify Collection Changed - بواسطة silverlight - 02-11-15, 05:55 PM
RE: Notify Collection Changed - بواسطة الشاكي لله - 02-11-15, 06:07 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Collection & DataBase Part 2 silverlight 0 2,299 02-12-15, 08:42 PM
آخر رد: silverlight
  Collection & DataBase Part 1 silverlight 1 2,813 25-07-15, 07:55 AM
آخر رد: silverlight

التنقل السريع :


يقوم بقرائة الموضوع: