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()
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
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الذي يعبر عن المرحلة المختارة في ComboBoxcbox_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الذي يعبر عن المجموعة المختارة في ComboBoxcbox_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
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
إذا كان لديك أي أسئلة أخرى أو تحتاج إلى مزيد من التوضيح، فلا تتردد في طرحها!

تعليقات
إرسال تعليق