القاعدة ستكون على SQL Server و هي كما بالصورة مؤلفة من جدولين الطلاب و دفعات الطلاب
بعد ذلك سنضيف كلاس خاص لكل جدول في مشروعنا اضف كلاس جديد و سميه Tb_Studant و هو خاص بجدول الطلاب
و اضف كلاس اخر سميه Tb_Payes و هو خاص بجدول الدفعات
الان اذهب الى جدول الطلاب و اضف له الحقول الخاصة به كما في الصورة و اتبع الخطوات المرفقة ليتم انشاء الحقول
و في كل كلاس سأورث الكلاس السابق و ساعرف متغيران نصيان واحد يحمل اسم الجدول و الاخر يحمل اسم حقل المفتاح الرئيسي ليصبح شكل الكلاس
كما يلي
الان ناتي الى تخصيص العمليات على هذا الجدول و سانشئ مصفوفة خاصة بحقول الجدول كما يلي
و ناتي الى تخصيص عمليات الملئ و الاضافة و التحديث و الحذف
اولاً الملئ
ثانياً الاضافة
ثالثاً التحديث
رابعاً الحذف وفق شرط
انتهينا الكلاس اصبح يحتوي على كل العمليات اللازمة للعمل
شكل الكلاس
ثانياً جدول الدفعات بنفس الطريقة السابقة تماماً , مع تخصيص اضافي كونه جدول ابن
كلاس جدول الدفعات
بعد هذا التخصيص ننتقل الى ادراج نموذج في المشروع لنبدأ التطبيق العملي
يتبع...
الان ادرج نموذج و سميه Form_Studants و اضف اليه العناصر كما في الصورة التالية
و اضف له كائن BindingSource و سميه BnStudant سوف نستخدمه للتنقل بين السجلات فقط
نعرف بعض المتغيرات في بداية النموذج
جدول يحمل بيانات الطلاب و جدول يحمل بيانات الدفعات
نعرف نسخة لكل كلاس لدينا
و نعرف متغير بولياني مهمته الكشف عن العملية هل هي اضافة ام تعديل
تحميل النموذج
لا شيئ سوى ملئ البيانات بالاعتماد على الكلاسات السابقة
اضافة طالب
الخطوات التي تجري
مسح مربعات النصوص و جدول الدفعات
تعطيل الازارا و تمكين قريد الدفعات للاضافة
و اعطاء قيمة للمتغير البولياني ان الحالة اضافة
تعديل طالب
نفس زر الاضافة و لكن المتغير البولياني حمل القيمة False دالاً على ان العملية هي تحديث بيانات
زر الحفظ
الخطوات
فحص حالة المتغير البولياني اذا كان True يعني اضافة
شحن جدول الطلاب بالبيانات ثم اضافة بيانات الطالب و استقبال القيمة الراجعة منه و التي تمثل رقم الطالب في Lable المسمى Lb_ID
و في حال كانت العملية تعديل يتم استدعاء دالة التحديث الخاصة بالطلاب
و اخيراً حفظ الدفعات (اجراء الدفعات سيرد لاحقاً)
و تعطيل الازرار و ابقاء الحالة على تعديل
حذف طالب مع دفعاته
اجراء شحن جدول الطلاب
اسناد قيم عادية لحقول كلاس الطلاب
شحن جدول الدفعات
نفس الطريقة السابقة سوى انها تحمل وسيطة تمثل الصف الذي نريد العمل عليه من جدول الدفعات
اجراء حفظ الدفعات
لاننا نتعامل مع كل السطور في DataGridView و لا ندري عن المستخدم هل اضاف ام عدل ام حذف
لذا استوجب منا ان نفحص حالة كل سطر من سطور جدول الدفعات و معرفة حالته عبر الخاصية DataRowState و نرسل الدالة المناسبة مع حالة كل سطر بعد تعبئته ببيانات الصف المحدد
ازارا التنقل بين الطلاب
حدث التنقل بين الطلاب و اعادة ملئ دفعات كل طالب
و اخيراً ربط عناصر الادخال بمصدر البيانات
اتمنى ان تكون الامور مفهومة و واضحة , و اتمنى من الله ان يكون هذا العمل فيه الفائدة لكم
و لاتنسونا من دعواتكم
بالتوفيق للجميع
بعد ذلك سنضيف كلاس خاص لكل جدول في مشروعنا اضف كلاس جديد و سميه Tb_Studant و هو خاص بجدول الطلاب
و اضف كلاس اخر سميه Tb_Payes و هو خاص بجدول الدفعات
الان اذهب الى جدول الطلاب و اضف له الحقول الخاصة به كما في الصورة و اتبع الخطوات المرفقة ليتم انشاء الحقول
و في كل كلاس سأورث الكلاس السابق و ساعرف متغيران نصيان واحد يحمل اسم الجدول و الاخر يحمل اسم حقل المفتاح الرئيسي ليصبح شكل الكلاس
كما يلي
PHP كود :
Public Class Tb_Studant
Inherits DbGo
'
Private _Stu_ID As Integer
Private _Stu_Name As String
Private _Stu_Phone As String
Private _Date_Affiliation As Object
'
Private ID_Key As String = "Stu_ID"
Private TableName As String = "Studants_TB"
Public Property Stu_ID As Integer
Get
Return _Stu_ID
End Get
Set(value As Integer)
_Stu_ID = value
End Set
End Property
Public Property Stu_Name As String
Get
Return _Stu_Name
End Get
Set(value As String)
_Stu_Name = value
End Set
End Property
Public Property Stu_Phone As String
Get
Return _Stu_Phone
End Get
Set(value As String)
_Stu_Phone = value
End Set
End Property
Public Property Date_Affiliation As Object
Get
Return _Date_Affiliation
End Get
Set(value As Object)
_Date_Affiliation = value
End Set
End Property
PHP كود :
'جدول الطلاب
Private Function Studants_Table() As Dictionary(Of String, Object)
Dim Stu_Tb As New Dictionary(Of String, Object)
Stu_Tb.Add("Stu_ID", Stu_ID)
Stu_Tb.Add("Stu_Name", Stu_Name)
Stu_Tb.Add("Stu_Phone", Stu_Phone)
Stu_Tb.Add("Date_Affiliation", Date_Affiliation)
Return Stu_Tb
End Function
اولاً الملئ
PHP كود :
''' <summary>
''' تعبئة جدول بحقول محددة
''' </summary>
''' <returns>يعيد جدول بيانات</returns>
Public Function FillTable() As DataTable
Return MyBase.Fill_Table(TableName, Studants_Table, "Stu_ID")
End Function
PHP كود :
''' <summary>
''' اضافة سجل جديد
''' </summary>
''' <param name="Msg">رسالة الاضافة اختيارية</param>
''' <returns>يعود بقيمة رقم الحقل الذي تمت اضافته</returns>
Public Function AddNew(Optional ByVal Msg As Boolean = False) As Integer
If Msg = True Then
Return Add_New(TableName, Studants_Table, ID_Key, True)
Else
Return Add_New(TableName, Studants_Table, ID_Key)
End If
End Function
PHP كود :
''' <summary>
''' تحديث سجل
''' </summary>
''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
''' <param name="Msg">عرض رسالة الحفظ اختياري</param>
Public Sub Update(ID As Integer, Optional ByVal Msg As Boolean = False)
If Msg = True Then
MyBase.Update_Table(TableName, Studants_Table, ID_Key, ID, True)
Else
MyBase.Update_Table(TableName, Studants_Table, ID_Key, ID, False)
End If
End Sub
PHP كود :
''' <summary>
''' حذف سجل من جدول وفق قيمة المفتاح الرئيسي
''' </summary>
''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
''' <param name="Msg">رسالة تأكيد الحذف اختيارية</param>
Public Sub Delete(ID As Integer, Optional Msg As Boolean = False)
If Msg = True Then
MyBase.Delete_Table(TableName, ID_Key, ID, True)
Else
MyBase.Delete_Table(TableName, ID_Key, ID, False)
End If
End Sub
شكل الكلاس
PHP كود :
Public Class Tb_Studant
Inherits DbGo
'
Private _Stu_ID As Integer
Private _Stu_Name As String
Private _Stu_Phone As String
Private _Date_Affiliation As Object
'
Private ID_Key As String = "Stu_ID"
Private TableName As String = "Studants_TB"
Public Property Stu_ID As Integer
Get
Return _Stu_ID
End Get
Set(value As Integer)
_Stu_ID = value
End Set
End Property
Public Property Stu_Name As String
Get
Return _Stu_Name
End Get
Set(value As String)
_Stu_Name = value
End Set
End Property
Public Property Stu_Phone As String
Get
Return _Stu_Phone
End Get
Set(value As String)
_Stu_Phone = value
End Set
End Property
Public Property Date_Affiliation As Object
Get
Return _Date_Affiliation
End Get
Set(value As Object)
_Date_Affiliation = value
End Set
End Property
'جدول الطلاب
Private Function Studants_Table() As Dictionary(Of String, Object)
Dim Stu_Tb As New Dictionary(Of String, Object)
Stu_Tb.Add("Stu_ID", Stu_ID)
Stu_Tb.Add("Stu_Name", Stu_Name)
Stu_Tb.Add("Stu_Phone", Stu_Phone)
Stu_Tb.Add("Date_Affiliation", Date_Affiliation)
Return Stu_Tb
End Function
''' <summary>
''' تعبئة جدول بحقول محددة
''' </summary>
''' <returns>يعيد جدول بيانات</returns>
Public Function FillTable() As DataTable
Return MyBase.Fill_Table(TableName, Studants_Table, "Stu_ID")
End Function
''' <summary>
''' اضافة سجل جديد
''' </summary>
''' <param name="Msg">رسالة الاضافة اختيارية</param>
''' <returns>يعود بقيمة رقم الحقل الذي تمت اضافته</returns>
Public Function AddNew(Optional ByVal Msg As Boolean = False) As Integer
If Msg = True Then
Return Add_New(TableName, Studants_Table, ID_Key, True)
Else
Return Add_New(TableName, Studants_Table, ID_Key)
End If
End Function
''' <summary>
''' تحديث سجل
''' </summary>
''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
''' <param name="Msg">عرض رسالة الحفظ اختياري</param>
Public Sub Update(ID As Integer, Optional ByVal Msg As Boolean = False)
If Msg = True Then
MyBase.Update_Table(TableName, Studants_Table, ID_Key, ID, True)
Else
MyBase.Update_Table(TableName, Studants_Table, ID_Key, ID, False)
End If
End Sub
''' <summary>
''' حذف سجل من جدول وفق قيمة المفتاح الرئيسي
''' </summary>
''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
''' <param name="Msg">رسالة تأكيد الحذف اختيارية</param>
Public Sub Delete(ID As Integer, Optional Msg As Boolean = False)
If Msg = True Then
MyBase.Delete_Table(TableName, ID_Key, ID, True)
Else
MyBase.Delete_Table(TableName, ID_Key, ID, False)
End If
End Sub
End Class
ثانياً جدول الدفعات بنفس الطريقة السابقة تماماً , مع تخصيص اضافي كونه جدول ابن
كلاس جدول الدفعات
PHP كود :
Public Class Tb_Payes
Inherits DbGo
'
Private _Pay_ID As Integer
Private _Principal_Payment As String
Private _Payment_Date As Object
Private _Stu_ID As Integer
'
Private ID_Key As String = "Pay_ID"
Private TableName As String = "PayMents_TB"
Public Property Pay_ID As Integer
Get
Return _Pay_ID
End Get
Set(value As Integer)
_Pay_ID = value
End Set
End Property
Public Property Principal_Payment As String
Get
Return _Principal_Payment
End Get
Set(value As String)
_Principal_Payment = value
End Set
End Property
Public Property Payment_Date As Object
Get
Return _Payment_Date
End Get
Set(value As Object)
_Payment_Date = value
End Set
End Property
Public Property Stu_ID As Integer
Get
Return _Stu_ID
End Get
Set(value As Integer)
_Stu_ID = value
End Set
End Property
'جدول الدفعات
Private Function Payes_Table() As Dictionary(Of String, Object)
Dim Payes_Tb As New Dictionary(Of String, Object)
Payes_Tb.Add("Pay_ID", Pay_ID)
Payes_Tb.Add("Principal_Payment", Principal_Payment)
Payes_Tb.Add("Payment_Date", Payment_Date)
Payes_Tb.Add("Stu_ID", Stu_ID)
Return Payes_Tb
End Function
''' <summary>
''' تعبئة جدول بحقول محددة
''' </summary>
''' <returns>يعيد جدول بيانات</returns>
Public Function FillTable() As DataTable
Return MyBase.Fill_Table(TableName, Payes_Table)
End Function
''' <summary>
''' تعبئة جدول بحقول محددة وفق شرط
''' </summary>
''' <param name="ID">قيمة الحقل الشرطي</param>
''' <returns>يعيد جدول بيانات</returns>
Public Function FillTable(ID As Object) As DataTable
Return MyBase.Fill_TableWithCoundition(TableName, Payes_Table, "Stu_ID", ID)
End Function
''' <summary>
''' اضافة سجل جديد
''' </summary>
''' <param name="Msg">رسالة الاضافة اختيارية</param>
''' <returns>يعود بقيمة رقم الحقل الذي تمت اضافته</returns>
Public Function AddNew(Optional ByVal Msg As Boolean = False) As Integer
If Msg = True Then
Return Add_New(TableName, Payes_Table, ID_Key, True)
Else
Return Add_New(TableName, Payes_Table, ID_Key)
End If
End Function
''' <summary>
''' تحديث سجل
''' </summary>
''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
''' <param name="Msg">عرض رسالة الحفظ اختياري</param>
Public Sub Update(ID As Integer, Optional ByVal Msg As Boolean = False)
If Msg = True Then
MyBase.Update_Table(TableName, Payes_Table, ID_Key, ID, True)
Else
MyBase.Update_Table(TableName, Payes_Table, ID_Key, ID, False)
End If
End Sub
''' <summary>
''' حذف سجل من جدول وفق قيمة المفتاح الرئيسي
''' </summary>
''' <param name="ID">قيمة حقل المفتاح الرئيسي</param>
''' <param name="Msg">رسالة تأكيد الحذف اختيارية</param>
Public Sub Delete(ID As Integer, Optional Msg As Boolean = False)
If Msg = True Then
MyBase.Delete_Table(TableName, ID_Key, ID, True)
Else
MyBase.Delete_Table(TableName, ID_Key, ID, False)
End If
End Sub
''' <summary>
''' حذف مجموعات دفعات للطالب الحالي وفق رقم الطالب
''' </summary>
''' <param name="StudantID">رقم الطالب - المعرف الفريد للطالب</param>
Public Sub Delete_Multi(StudantID As Integer)
'قائمة الشروط
Dim CondConditions As New Dictionary(Of String, Object)
CondConditions.Add("Stu_ID", StudantID)
Delete_TableByMultiCounditions(TableName, CondConditions)
End Sub
End Class
بعد هذا التخصيص ننتقل الى ادراج نموذج في المشروع لنبدأ التطبيق العملي
يتبع...
الان ادرج نموذج و سميه Form_Studants و اضف اليه العناصر كما في الصورة التالية
و اضف له كائن BindingSource و سميه BnStudant سوف نستخدمه للتنقل بين السجلات فقط
نعرف بعض المتغيرات في بداية النموذج
PHP كود :
Public Class Form_Studants
Dim Dt_Studant, Dt_Payes As New DataTable
Dim Studant As New Tb_Studant
Dim Payes As New Tb_Payes
'
Dim Add_Edit As Boolean = False
نعرف نسخة لكل كلاس لدينا
و نعرف متغير بولياني مهمته الكشف عن العملية هل هي اضافة ام تعديل
تحميل النموذج
PHP كود :
Private Sub Form_Studants_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dt_Studant = Studant.FillTable
BnStudant.DataSource = Dt_Studant
Data_Bind()
Try
Dt_Payes = Payes.FillTable(CType(Lb_ID.Text, Integer))
DG_Payes.DataSource = Dt_Payes
Catch ex As Exception
End Try
End Sub
اضافة طالب
PHP كود :
'زر اضافة طالب
Private Sub Btn_AddStud_Click(sender As Object, e As EventArgs) Handles Btn_AddStud.Click
Txt_Name.Clear()
Txt_Phone.Clear()
Txt_Name.Focus()
Dt_Payes.Clear()
'
Btn_AddStud.Enabled = False
Btn_Delete.Enabled = False
Btn_EditStud.Enabled = False
Btn_Save.Enabled = True
Btn_First.Enabled = False
Btn_Last.Enabled = False
Btn_Next.Enabled = False
Btn_Prev.Enabled = False
'
DG_Payes.ReadOnly = False
Add_Edit = True
End Sub
مسح مربعات النصوص و جدول الدفعات
تعطيل الازارا و تمكين قريد الدفعات للاضافة
و اعطاء قيمة للمتغير البولياني ان الحالة اضافة
تعديل طالب
PHP كود :
'زر تعديل طالب
Private Sub Btn_EditStud_Click(sender As Object, e As EventArgs) Handles Btn_EditStud.Click
Btn_AddStud.Enabled = False
Btn_Delete.Enabled = False
Btn_EditStud.Enabled = False
Btn_Save.Enabled = True
'
Btn_First.Enabled = False
Btn_Last.Enabled = False
Btn_Next.Enabled = False
Btn_Prev.Enabled = False
'
DG_Payes.ReadOnly = False
Add_Edit = False
End Sub
زر الحفظ
PHP كود :
'زر حفظ الكل
Private Sub Btn_Save_Click(sender As Object, e As EventArgs) Handles Btn_Save.Click
If Add_Edit = True Then
Bind_Studant()
Lb_ID.Text = Studant.AddNew(True)
Else
Bind_Studant()
Studant.Update(CInt(Lb_ID.Text), True)
End If
Save_Payes()
Btn_AddStud.Enabled = True
Btn_Delete.Enabled = True
Btn_EditStud.Enabled = True
Btn_Save.Enabled = False
'
Btn_First.Enabled = True
Btn_Last.Enabled = True
Btn_Next.Enabled = True
Btn_Prev.Enabled = True
'
DG_Payes.ReadOnly = True
Add_Edit = False
End Sub
فحص حالة المتغير البولياني اذا كان True يعني اضافة
شحن جدول الطلاب بالبيانات ثم اضافة بيانات الطالب و استقبال القيمة الراجعة منه و التي تمثل رقم الطالب في Lable المسمى Lb_ID
و في حال كانت العملية تعديل يتم استدعاء دالة التحديث الخاصة بالطلاب
و اخيراً حفظ الدفعات (اجراء الدفعات سيرد لاحقاً)
و تعطيل الازرار و ابقاء الحالة على تعديل
حذف طالب مع دفعاته
PHP كود :
'حذف طالب
Private Sub Btn_Delete_Click(sender As Object, e As EventArgs) Handles Btn_Delete.Click
If Dt_Payes.Rows.Count > 0 Then
Payes.Delete_Multi(CType(Lb_ID.Text, Integer))
End If
Dim pos As Integer = BnStudant.Position
Studant.Delete(CType(Lb_ID.Text, Integer))
'اعادة لملئ
Dt_Studant = Studant.FillTable
BnStudant.DataSource = Dt_Studant
If BnStudant.Count > 0 Then
BnStudant.Position = pos - 1
End If
End Sub
اجراء شحن جدول الطلاب
PHP كود :
'شحن جدول الطلاب
Private Sub Bind_Studant()
Studant = New Tb_Studant With {.Stu_Name = Txt_Name.Text,
.Stu_Phone = Txt_Phone.Text,
.Date_Affiliation = DT_Affiliation.Value}
End Sub
شحن جدول الدفعات
PHP كود :
'شحن جدول الدفعات
Private Sub Bind_Payes(Row As DataRow)
Payes = New Tb_Payes With {.Principal_Payment = Row.Item("Principal_Payment"),
.Payment_Date = Row.Item("Payment_Date"),
.Stu_ID = Lb_ID.Text}
End Sub
اجراء حفظ الدفعات
PHP كود :
''' <summary>
''' حفظ او تعديل او حذف دفعات
''' </summary>
''' <param name="Add_Update">If is True Then The case is Add New , Else The Case is Update</param>
Private Sub Save_Payes()
If Dt_Payes.Rows.Count > 0 Then
For Each row As DataRow In Dt_Payes.Rows
Bind_Payes(row)
If row.RowState = DataRowState.Modified Then
Payes.Update(row("Pay_ID"))
ElseIf row.RowState = DataRowState.Added Then
row.Item("Pay_ID") = Payes.AddNew(False)
row.Item("Stu_ID") = Lb_ID.Text
ElseIf row.RowState = DataRowState.Deleted Then
Payes.Delete(row.Item("Pay_ID", DataRowVersion.Original))
End If
Next
End If
End Sub
لذا استوجب منا ان نفحص حالة كل سطر من سطور جدول الدفعات و معرفة حالته عبر الخاصية DataRowState و نرسل الدالة المناسبة مع حالة كل سطر بعد تعبئته ببيانات الصف المحدد
ازارا التنقل بين الطلاب
PHP كود :
'اول
Private Sub Btn_First_Click(sender As Object, e As EventArgs) Handles Btn_First.Click
BnStudant.MoveFirst()
End Sub
'سابق
Private Sub Btn_Prev_Click(sender As Object, e As EventArgs) Handles Btn_Prev.Click
BnStudant.MovePrevious()
End Sub
'تالي
Private Sub Btn_Next_Click(sender As Object, e As EventArgs) Handles Btn_Next.Click
BnStudant.MoveNext()
End Sub
'اخير
Private Sub Btn_Last_Click(sender As Object, e As EventArgs) Handles Btn_Last.Click
BnStudant.MoveLast()
End Sub
PHP كود :
'تعبئة الدفعات بتغيير الطالب
Private Sub BnStudant_CurrentChanged(sender As Object, e As EventArgs) Handles BnStudant.CurrentChanged, BnStudant.PositionChanged
Dt_Payes = Payes.FillTable(CType(Lb_ID.Text, Integer))
DG_Payes.DataSource = Dt_Payes
End Sub
PHP كود :
'ربط العناصر بمصدر البيانات
Private Sub Data_Bind()
Txt_Name.DataBindings.Clear()
Txt_Phone.DataBindings.Clear()
Lb_ID.DataBindings.Clear()
'
Txt_Name.DataBindings.Add(New Binding("text", BnStudant, "Stu_Name"))
Txt_Phone.DataBindings.Add(New Binding("text", BnStudant, "Stu_Phone"))
Lb_ID.DataBindings.Add(New Binding("text", BnStudant, "Stu_ID"))
End Sub
و لاتنسونا من دعواتكم
بالتوفيق للجميع
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال


