02-11-15, 04:25 PM
(آخر تعديل لهذه المشاركة : 02-11-15, 04:34 PM {2} بواسطة silverlight.)
السلام عليكم ورحمة الله وبركاته
كيف يمكن عمل 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 بالبيانات
في الكود التالي ستجدون الكود الكامل للخطوات السابقة
الأن قم بتجربة المشروع لتري ماذا سيحدث عندما تقوم بحذف او اضافة عنصر معين من 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
تقبلوا تحياتي
اخوكم عمر
كيف يمكن عمل 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
تقبلوا تحياتي
اخوكم عمر