تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
إيجاد جميع الكونترول الموجودة في الفورم Recursively Find All Controls in Form
#1
[rtl]السلام عليكم و رحمة الله وبركاته

مقدمة:

أحد اهم الاسئلة الشائعة في النت هو كيف أمسح جميع التكست الموجود في مجموعة من التكست بوكس كونترول الموجودة علي الفورم؟ [/rtl]

[rtl] [/rtl]
[rtl]بالتأكيد جميع الاجابات التي سوف تجدها علي النت هي إجابات صحيحية و مناسبة لكن يتبقي السؤال


ماذا لو كان هذا التكست بوكس ليس موجودا بشكل مباشر علي الفورم نفسه بل موجودا داخل كونترول أخر مثل  Panel  أو مثل GroupBox أو مثل TabControl ؟

الإجابة علي مثل هذا السؤال تنحصر في كلمة واحدة و هي Recursion

وهنا قد يتبارد الي ذهن البعض ما هو تعريف هذا الشئ الذي نطلق عليه Recursion ؟

تعريف   Recursion

هو أن تقوم الدالة Function او الروتين Sub او الطريقة Method  بإستدعاء نفسها من داخل نفسها [/rtl]

[rtl]وهذا يعني أننا هنا نقوم بعمل Looping بدون استخدام جمل برمجية مثل For .... Next او  For .... Each[/rtl]

[rtl]أي أن Recursion   وببساطة شديدة هو شئ عكس كلمة  Iteration أو بشكل أكثر دقة فإن  Recursion هو عبارة عن محاولة إيجاد حل لمشكلة رئيسية Main Problem و ايضا إيجاد حلول لجميع المشاكل الفرعية Minor Problems المتصلة بالمشكلة الرئيسية ..... مع الوضع في الاعتبار أن المشكلتان من نفس النوعية

مثال توضيحي :

عندما تحاول أن تجد جميع الكونترول علي الفورم فأنت هنا تحاول إيجاد حل لمشكلة رئيسية و عندما تحاول أن تبحث داخل بقية الكونترول الاخري علي الفورم فانت هنا تحاول إيجاد حل لمشكلة فرعية و لكنها من نفس نوعية المشكلة الرئيسية. الكود اتالي يوضح الفكرة بشكل أفضل من الحديث النظري

 
الكود:

لقد قمت باستخدام HashSet(Of T) Class لأنه لا يكرر المدخلات و يمكن استخدام اي Collection  مناسبة بدلا منه[/rtl]

[rtl] في الكود أدناه ستجدون طريقتان لكيفية استرجاع جميع الكونترول الموجودة علي الفورم [/rtl]

الطريقة الأولي:


كود :
  '  Method 1
   ..........................................................................................

   ' This Method will detect contols only and components will not detected
   Friend Shared Sub FindControls(ctrlContainer As Control, controls As HashSet(Of Control))
       If ctrlContainer Is Nothing Then
           Return
       End If
       For Each ctrl As Control In ctrlContainer.Controls
           controls.Add(ctrl)
           ' If the control has hildren, recursively call this Method
           If ctrl.HasChildren Then
               FindControls(ctrl, controls)
           End If
       Next
   End Sub

   ' This Function will return contols only and components will not be returned
   Friend Shared Function GetControls(list As ICollection, ctrlContainer As Control) As HashSet(Of Control)
       If list Is Nothing OrElse ctrlContainer Is Nothing Then
           Return Nothing
       End If
       Dim controls As HashSet(Of Control) = New HashSet(Of Control)()
       For Each ctrl As Control In list
           controls.Add(ctrl)
           FindControls(ctrlContainer, controls)
       Next
       Return controls
   End Function

الطريقة الثانية:


كود :
'  Method 2
   ..........................................................................................

   ' This Function will return contols only and components will not be returned
   Public Shared Function GetControls(ctrls As ICollection) As HashSet(Of Control)
       Dim controls As New HashSet(Of Control)()
       For Each ctrl As Control In ctrls
           controls.Add(ctrl)
           If ctrl.HasChildren Then
               Dim childs As HashSet(Of Control) = GetControls(ctrl.Controls)
               For Each child As Control In childs
                   controls.Add(child)
               Next
           End If
       Next
       Return controls
   End Function


[rtl]كيفية استخدام الكود: [/rtl]

[rtl] 
[/rtl]
كود :
   '  Method 1 Usage

       For Each ctrl As Control In GetControls(Me.GroupBox1.Controls, Me.GroupBox1)
           ListBox2.Sorted = True
           If TypeOf ctrl Is TextBox Then
               ctrl.Text = "أهلا بكم جميعا"
               ListBox2.Items.Add(ctrl.Name)
           End If
       Next

 '  Method 2 Usage

       For Each ctrl As Control In GetControls(Me.Controls)
           Me.ListBox1.Items.Add(ctrl.Name)
           Me.ListBox1.Sorted = True
           If TypeOf ctrl Is TextBox Then
               ctrl.Text = "Hello World"
           End If
       Next

 '  Method 2 Usage

       ' مسح جميع التكست الموجودة في التكست بوكس
       For Each ctrl As Control In GetControls(Me.Controls)
           If TypeOf ctrl Is TextBox Then
               ctrl.Text = ""
           End If
       Next



[rtl] [/rtl]
[rtl]المرفقات[/rtl]

المرفقات ستجدون ملف به جميع الأكواد السابقة

المراجع:

HashSet Class

تقبلوا تحياتي و بالتوفيق للجميع


الملفات المرفقة
.rar   Test_AllTextBoxText.rar (الحجم : 206.68 ك ب / التحميلات : 168)
الرد }}}


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  حساب مكان الفورم علي شاشة الكمبيوتر silverlight 2 3,158 18-06-23, 03:26 PM
آخر رد: kebboud
  الحلقة السابعة من السلسلة 167- استخراج جميع معلومات الجهاز RaggiTech 5 4,494 29-06-21, 05:29 AM
آخر رد: kebboud
Rainbow Toolbox in VB.NET - Common Controls - Lesson Third - CheckBox Genius Live 1 4,183 11-06-20, 08:20 PM
آخر رد: alsouf
  [VB.NET] كود يجعل الفورم فى المقدمة دائماً [ بناءاً لطلب احد الاخوة وحتى سيتفاد منه الجميع ] elgokr 5 2,902 16-06-19, 08:32 AM
آخر رد: sendbad100
Rainbow [VB.NET] كلاس ResizeControls وطريقة جديد ومميزة لتكبير وتصغير ادوات الفورم تلقائيا الماجيك مسعد 8 8,731 01-10-18, 03:03 AM
آخر رد: LEO
Video [درس فيديو] طريقة تحميل وتثبيت visual studio 2017 مع جميع التحديثات Ikode 1 10,139 11-08-18, 08:48 PM
آخر رد: galas
  [كود] تأثيرات على Form او على Objects HASAN6.0 5 3,910 25-03-18, 01:49 PM
آخر رد: رسول555
  الفورم بخاصية none محمود صالح 1 2,049 30-12-17, 03:52 AM
آخر رد: طالب برمجة
  Blend Form silverlight 0 2,236 11-10-17, 05:11 PM
آخر رد: silverlight
  رسم الفورم و طباعته silverlight 1 2,398 19-06-17, 05:44 PM
آخر رد: silverlight

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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم