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