26 | Filter Students List based on students' stage and Group in DataGridView - VB.NET & SQL Server

أولاًcbox_stage_SelectedIndexChanged

 

شرح الكود:

هذا الكود يتعامل مع الحدث SelectedIndexChanged للـ ComboBox المسمى cbox_stage، حيث يقوم بتحديث cbox_group بناءً على stage المختار في cbox_stage.

١. الحدث SelectedIndexChanged:

Private Sub cbox_stage_SelectedIndexChanged(sender As Object, e As EventArgs) Handles

cbox_stage.SelectedIndexChanged


  • هذا الحدث يُنفَّذ كلما تم تغيير اختيار cbox_stage، أي عندما يختار المستخدم قيمة مختلفة في الـ ComboBox.

٢. إعداد الاتصال بقاعدة البيانات:


Dim con As New SqlConnection(conString)

Dim dtstage As New DataTable()

dtstage.Clear()

  • يتم إنشاء SqlConnection باستخدام (conString (السلسلة التي تحتوي على تفاصيل الاتصال بقاعدة البيانات.
  • يتم أيضًا إنشاء DataTable جديد يُستخدم لتخزين البيانات المسترجعة من قاعدة البيانات.

٣. مسح مصدر البيانات للمجموعة:


cbox_group.DataSource = Nothing


  • قبل تحميل البيانات الجديدة للمجموعة (cbox_group)، يتم مسح DataSource الحالي.

٤. إعداد استعلام SQL:


Using cmd As New SqlCommand("Select stage_group from View_st_info where stage = @stage

GROUP BY stage_group", con)

cmd.Parameters.AddWithValue("@stage",

cbox_stage.Text.Trim())


  • يتم إعداد SqlCommand لتنفيذ استعلام SQL يعرض stage_group من View_st_info بناءً على stage المختار في cbox_stage.

٥. تنفيذ الاستعلام وملء DataTable:


cmd.CommandType = CommandType.Text

cmd.CommandTimeout = 420

con.Open()

dtstage.Load(cmd.ExecuteReader())

  • يتم تحديد CommandType ليكون Text (استعلام نصي).
  • تم تحديد CommandTimeout إلى 420 ثانية لانتظار تنفيذ الاستعلام.
  • يتم فتح الاتصال بقاعدة البيانات عبر con.Open().
  • بعد تنفيذ الاستعلام باستخدام ExecuteReader()، يتم تحميل البيانات المسترجعة إلى DataTable (dtstage).

٦. التحقق من وجود بيانات:


If dtstage.Rows.Count <> 0 Then

cbox_group.DataSource = dtstage

cbox_group.DisplayMember = "stage_group"

con.Close()

Else

con.Close()

End If


  • إذا كانت DataTable تحتوي على بيانات (أي تم العثور على stage_group)، يتم:
    • تعيين cbox_group.DataSource إلى dtstage، مما يعني أن ComboBox سيعرض البيانات المسترجعة.
    • تعيين DisplayMember إلى stage_group لعرض الأسماء الصحيحة في cbox_group.
  • إذا لم توجد بيانات، يتم إغلاق الاتصال فقط.

٧. إغلاق الاتصال:

con.Close()

  • يتم إغلاق الاتصال بقاعدة البيانات بعد تنفيذ الاستعلام.

الخلاصة:

  • عند تغيير اختيار stage في cbox_stage، يقوم الكود بإجراء استعلام في قاعدة البيانات لجلب مجموعات المرحلة stage_group المرتبطة بالمرحلة المختارة.
  • يتم تحديث cbox_group ليعرض هذه المجموعات، مما يسمح للمستخدم باختيار stage_group بناءً على stage المختار.

الكود داخل حدث cbox_stage_SelectedIndexChanged

Private Sub cbox_stage_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cbox_stage.SelectedIndexChanged

        Dim con As New SqlConnection(conString)

        Dim dtstage As New DataTable()

        dtstage.Clear()

 

        cbox_group.DataSource = Nothing

 

 

        Using cmd As New SqlCommand("Select stage_group from View_st_info where stage = @stage GROUP BY stage_group", con)

            cmd.Parameters.AddWithValue("@stage", cbox_stage.Text.Trim())

 

            cmd.CommandType = CommandType.Text

            cmd.CommandTimeout = 420

            con.Open()

            dtstage.Load(cmd.ExecuteReader())

 

            If dtstage.Rows.Count <> 0 Then

                cbox_group.DataSource = dtstage

                cbox_group.DisplayMember = "stage_group"

                con.Close()

            Else

                con.Close()

            End If

        End Using

    End Sub

 


ثانياًbtn_find_stage_Click


شرح الكود:

الهدف من هذا الكود هو تنفيذ عملية بحث في قاعدة البيانات بناءً على قيمة stage و stage_group المُختارة في ComboBox.

١. الحدث btn_find_stage_Click:

Private Sub btn_find_stage_Click(sender As Object, e As EventArgs) Handles

btn_find_stage.Click


  • هذا الحدث يتم تنفيذه عندما يقوم المستخدم بالنقر على زر btn_find_stage.

٢. التحقق من قيمة cbox_group:

If cbox_group.Text = Nothing Then


  • يتم التحقق إذا كانت قيمة cbox_group فارغة، أي إذا لم يختار المستخدم أي مجموعة.

٣. إعداد الاتصال بقاعدة البيانات عند عدم تحديد مجموعة:

Dim con As New SqlConnection(conString)

Dim dt As New DataTable

dt.Clear()

dgv_students.Columns.Clear()

  • يتم إنشاء SqlConnection باستخدام conString، ثم يتم إعداد DataTable لتخزين البيانات المسترجعة.
  • يتم مسح البيانات الحالية في DataGridView عن طريق dgv_students.Columns.Clear().

٣.١. استعلام SQL عند عدم تحديد مجموعة:

Using cmd As New SqlCommand("SELECT ID, st_name, stage, stage_group, registration_date,

discount, discount_type, study_fee,  study_fee_after_discount,

notes from View_st_info WHERE stage = @stage order by stage_id", con)


  • يتم تنفيذ استعلام SQL لجلب البيانات التي تتعلق بالمرحلة المختارة في cbox_stage، ولكن دون تحديد مجموعة معينة.

  • cmd.Parameters.AddWithValue("@stage", cbox_stage.Text.Trim()) يضيف المعامل stage الذي يعبر عن المرحلة المختارة في ComboBox cbox_stage.


٣.٢. تنفيذ الاستعلام وملء البيانات في DataGridView:

cmd.Parameters.AddWithValue("@stage",

cbox_stage.Text.Trim())

cmd.CommandType = CommandType.Text

cmd.CommandTimeout = 420

con.Open()

dt.Load(cmd.ExecuteReader())

  • يتم فتح الاتصال بقاعدة البيانات، تنفيذ الاستعلام، وتحميل البيانات في DataTable.

٣.٣. إضافة الأعمدة للـ DataGridView:

If dt.Rows.Count <> 0 Then

dgv_students.DataSource = dt


Dim clmn_profile As New DataGridViewButtonColumn

clmn_profile.Name = "profile"

clmn_profile.Text = "🙍"

clmn_profile.FlatStyle = FlatStyle.Flat

clmn_profile.UseColumnTextForButtonValue = True

dgv_students.Columns.Add(clmn_profile)


Dim clmn_edit As New DataGridViewButtonColumn

clmn_edit.Name = "edit"

clmn_edit.Text = "📝"

clmn_edit.FlatStyle = FlatStyle.Flat

clmn_edit.UseColumnTextForButtonValue = True

dgv_students.Columns.Add(clmn_edit)


Dim clmn_delete As New DataGridViewButtonColumn

clmn_delete.Name = "delete"

clmn_delete.Text = ""

clmn_delete.FlatStyle = FlatStyle.Flat

clmn_delete.UseColumnTextForButtonValue = True

dgv_students.Columns.Add(clmn_delete)


Dim clmn_delete1 As New DataGridViewButtonColumn

clmn_delete1.Name = "delete1"

clmn_delete1.Text = ""

clmn_delete1.FlatStyle = FlatStyle.Flat

clmn_delete1.UseColumnTextForButtonValue = True

dgv_students.Columns.Add(clmn_delete1)

dgv_students_format()

con.Close()


Else         

       

dgv_students.Columns.Clear()

dgv_students.DataSource = Nothing

End If


  • إذا كانت هناك بيانات في DataTable، يتم تعيينها كمصدر بيانات لـ DataGridView.
  • بعد ذلك، يتم إضافة أربعة أعمدة من نوع DataGridViewButtonColumn وهي:
    • profile: لعرض أيقونة ملف التعريف.
    • edit: لعرض أيقونة التعديل.
    • delete: لعرض أيقونة الحذف.
    • delete1: عمود آخر لحذف.

٣.٤. إغلاق الاتصال:

con.Close()


  • بعد تحميل البيانات وإضافة الأعمدة، يتم إغلاق الاتصال بقاعدة البيانات.

٤. إعداد الاتصال بقاعدة البيانات عند تحديد مجموعة:

        Else

            Dim con As New SqlConnection(conString)

            Dim dt As New DataTable

            dt.Clear()

            dgv_students.Columns.Clear()


  • إذا تم تحديد stage_group في cbox_group، يتم تنفيذ الجزء التالي من الكود.

٤.١. استعلام SQL عند تحديد مجموعة:

Using cmd As New SqlCommand("SELECT

ID, st_name, stage, stage_group, registration_date, discount, discount_type, study_fee,  study_fee_after_discount, notes from View_st_info WHERE stage = @stage and stage_group = @stage_group order by stage_id", con)

cmd.Parameters.AddWithValue("@stage",

cbox_stage.Text.Trim())

cmd.Parameters.AddWithValue("@stage_group",

cbox_group.Text.Trim())


  • استعلام SQL يتم تنفيذه لجلب البيانات بناءً على stage و stage_group.
  • cmd.Parameters.AddWithValue("@stage_group", cbox_group.Text.Trim()) يضيف المعامل stage_group الذي يعبر عن المجموعة المختارة في ComboBox cbox_group.

٤.٢. تنفيذ الاستعلام وملء البيانات في DataGridView:

cmd.CommandType = CommandType.Text

cmd.CommandTimeout = 420

con.Open()

dt.Load(cmd.ExecuteReader())

End If


  • يتم فتح الاتصال بقاعدة البيانات، تنفيذ الاستعلام، وتحميل البيانات في DataTable.

٤.٣. إضافة الأعمدة لعرض الأزرار في DataGridView:

If dt.Rows.Count <> 0 Then

dgv_students.DataSource = dt


Dim clmn_profile As New DataGridViewButtonColumn

clmn_profile.Name = "profile"

clmn_profile.Text = "🙍"

clmn_profile.FlatStyle = FlatStyle.Flat

clmn_profile.UseColumnTextForButtonValue = True

dgv_students.Columns.Add(clmn_profile)


Dim clmn_edit As New DataGridViewButtonColumn

clmn_edit.Name = "edit"

clmn_edit.Text = "📝"

clmn_edit.FlatStyle = FlatStyle.Flat

clmn_edit.UseColumnTextForButtonValue = True

dgv_students.Columns.Add(clmn_edit)


Dim clmn_delete As New DataGridViewButtonColumn

clmn_delete.Name = "delete"

clmn_delete.Text = ""

clmn_delete.FlatStyle = FlatStyle.Flat

clmn_delete.UseColumnTextForButtonValue = True

dgv_students.Columns.Add(clmn_delete)


Dim clmn_delete1 As New DataGridViewButtonColumn

clmn_delete1.Name = "delete1"

clmn_delete1.Text = ""

clmn_delete1.FlatStyle = FlatStyle.Flat

clmn_delete1.UseColumnTextForButtonValue = True

dgv_students.Columns.Add(clmn_delete1)

dgv_students_format()

con.Close()

     

  • نفس العملية السابقة من إضافة الأعمدة وتعيين البيانات في DataGridView إذا كانت هناك بيانات.

٤.٤. إغلاق الاتصال:

con.Close()


  • بعد تنفيذ الاستعلام وإغلاق الاتصال، يتم إغلاق الاتصال بقاعدة البيانات.

الخلاصة:

  • btn_find_stage_Click هو حدث يتم تنفيذه عند النقر على الزر btn_find_stage.
  • إذا كانت cbox_group فارغة، يتم إجراء استعلام بناءً على stage فقط.
  • إذا كانت cbox_group تحتوي على قيمة، يتم إجراء استعلام باستخدام كل من stage و stage_group.
  • في كلتا الحالتين، يتم عرض البيانات في DataGridView مع إضافة الأعمدة الخاصة بالأزرار مثل ملف التعريف، التعديل، و الحذف.


الكود داخل حدث btn_find_stage_Click

Private Sub btn_find_stage_Click(sender As Object, e As EventArgs) Handles btn_find_stage.Click

        If cbox_group.Text = Nothing Then

            Dim con As New SqlConnection(conString)

            Dim dt As New DataTable

            dt.Clear()

            dgv_students.Columns.Clear()

 

            Using cmd As New SqlCommand("SELECT ID, st_name, stage, stage_group, registration_date, discount, discount_type, study_fee,  study_fee_after_discount, notes from View_st_info WHERE stage = @stage order by stage_id", con)

                cmd.Parameters.AddWithValue("@stage", cbox_stage.Text.Trim())

                cmd.CommandType = CommandType.Text

                cmd.CommandTimeout = 420

                con.Open()

                dt.Load(cmd.ExecuteReader())

                If dt.Rows.Count <> 0 Then

                    dgv_students.DataSource = dt

 

                    Dim clmn_profile As New DataGridViewButtonColumn

                    clmn_profile.Name = "profile"

                    clmn_profile.Text = "🙍"

                    clmn_profile.FlatStyle = FlatStyle.Flat

                    clmn_profile.UseColumnTextForButtonValue = True

                    dgv_students.Columns.Add(clmn_profile)

 

                    Dim clmn_edit As New DataGridViewButtonColumn

                    clmn_edit.Name = "edit"

                    clmn_edit.Text = "📝"

                    clmn_edit.FlatStyle = FlatStyle.Flat

                    clmn_edit.UseColumnTextForButtonValue = True

                    dgv_students.Columns.Add(clmn_edit)

 

                    Dim clmn_delete As New DataGridViewButtonColumn

                    clmn_delete.Name = "delete"

                    clmn_delete.Text = ""

                    clmn_delete.FlatStyle = FlatStyle.Flat

                    clmn_delete.UseColumnTextForButtonValue = True

                    dgv_students.Columns.Add(clmn_delete)

 

                    Dim clmn_delete1 As New DataGridViewButtonColumn

                    clmn_delete1.Name = "delete1"

                    clmn_delete1.Text = ""

                    clmn_delete1.FlatStyle = FlatStyle.Flat

                    clmn_delete1.UseColumnTextForButtonValue = True

                    dgv_students.Columns.Add(clmn_delete1)

                    dgv_students_format()

                    con.Close()

                Else

 

                    dgv_students.Columns.Clear()

                    dgv_students.DataSource = Nothing

 

                End If

                con.Close()

            End Using

 

        Else

            Dim con As New SqlConnection(conString)

            Dim dt As New DataTable

            dt.Clear()

            dgv_students.Columns.Clear()

 

            Using cmd As New SqlCommand("SELECT ID, st_name, stage, stage_group, registration_date, discount, discount_type, study_fee,  study_fee_after_discount, notes from View_st_info WHERE stage = @stage and stage_group = @stage_group order by stage_id", con)

                cmd.Parameters.AddWithValue("@stage", cbox_stage.Text.Trim())

                cmd.Parameters.AddWithValue("@stage_group", cbox_group.Text.Trim())

                cmd.CommandType = CommandType.Text

                cmd.CommandTimeout = 420

                con.Open()

                dt.Load(cmd.ExecuteReader())

                If dt.Rows.Count <> 0 Then

                    dgv_students.DataSource = dt

 

                    Dim clmn_profile As New DataGridViewButtonColumn

                    clmn_profile.Name = "profile"

                    clmn_profile.Text = "🙍"

                    clmn_profile.FlatStyle = FlatStyle.Flat

                    clmn_profile.UseColumnTextForButtonValue = True

                    dgv_students.Columns.Add(clmn_profile)

 

                    Dim clmn_edit As New DataGridViewButtonColumn

                    clmn_edit.Name = "edit"

                    clmn_edit.Text = "📝"

                    clmn_edit.FlatStyle = FlatStyle.Flat

                    clmn_edit.UseColumnTextForButtonValue = True

                    dgv_students.Columns.Add(clmn_edit)

 

                    Dim clmn_delete As New DataGridViewButtonColumn

                    clmn_delete.Name = "delete"

                    clmn_delete.Text = ""

                    clmn_delete.FlatStyle = FlatStyle.Flat

                    clmn_delete.UseColumnTextForButtonValue = True

                    dgv_students.Columns.Add(clmn_delete)

 

                    Dim clmn_delete1 As New DataGridViewButtonColumn

                    clmn_delete1.Name = "delete1"

                    clmn_delete1.Text = ""

                    clmn_delete1.FlatStyle = FlatStyle.Flat

                    clmn_delete1.UseColumnTextForButtonValue = True

                    dgv_students.Columns.Add(clmn_delete1)

                    dgv_students_format()

                    con.Close()

                Else

 

                    dgv_students.Columns.Clear()

                    dgv_students.DataSource = Nothing

 

                End If

                con.Close()

            End Using

        End If

 



 

إذا كان لديك أي أسئلة أخرى أو تحتاج إلى مزيد من التوضيح، فلا تتردد في طرحها!

يمكنكم متابعة الدرس عن طريق اليوتيوب







 

تعليقات

المشاركات الشائعة من هذه المدونة

7 | Display column's stages from the database into ComboBox's Stage - VB.NET & SQL Server

8 | Get selected Stage and Group IDs from their ComboBoxes - VB.NET & SQL Server