09-04-17, 01:27 AM (آخر تعديل لهذه المشاركة : 09-04-17, 02:26 AM {2} بواسطة ابو ليلى.)
بســـــــــــم الله الرحمن الرحيم
السلام عليكم و رحمة الله و بركاته ابدأ معكم بمراجعة بسيطة بطرق تعاملنا مع الجداول وفق تقنية ADO.Net و اهم العمليات التي نحتاجها بشكل متكرر اثناء عملنا مع اي جدول , لا يخفى على الجميع و الكل يعرف اننا دائما و ابداً نحن امام الحالات التقليدية (الاضافة و التعديل و الحذف) كحالات رئيسة ترافق العمل مع اي جدول بالاضافة للحالات الاخرى حسب الحاجة من عمليات البحث او تجميع البيانات وفق اي نوع من الاستعلامات تفرضه علينا الحاجة . و اعتدنا دائماً على التعامل مع الجمل التقليدية التي توافق كل حالة و على اعادة تكرارها مع كل مشروع . و الذي يختلف فقط هو عدد الحقول و اسمائها و انواع بيانات الحقول فيها . و هذا التكرار اشبه بعملية النسخ و اللصق و تغير ما يلزم وفق المعطيات التي يحملها المشروع الجديد
هذه المقدمة البسيطة ضرورية لنتجاوز التكرار او بالمختصر لنحول عملية النسخ و اللصق المعتادة الى طريقة عملية تجعلنا نستفيد من الثوابت في جمل الادخال و الاضافة و التعديل و البحث و غيرها من الجمل و نحولها الى دوال منفصلة نحتاج فيها فقط ما يتغير مع كل مشروع جديد , و بالتالي نفصلها في فئة خاصة بها بعيداً عن واجهة البرنامج (مثل مكتبة او اطار عمل) و عند حاجتنا لها نستدعي المكتبة و نغير فقط ما يسمح لنا بتغيره و بالتالي وفرنا على انفسنا عناء اعادة كتابة الجمل كل مرة.
و من جهة اخرى و هي الباب الثاني في الموضوع اننا نتعامل مع جدول عبارة عن كائن منفصل يحتوي على حقول محددة , و هذه الحقول هي التي ستقوم عليها العمليات السابقة , بالاضافة لاي عمليات اخرى قد تحتاجها على هذا الكائن لذا ارى انه من الافضل ان تكون هذه العمليات الخاصة بهذا الكائن حكراً عليه و ان رايت ان اكثر من كائن يمكن ان يتشارك في هذه العملية يمكنك جعلها في المكتبة الرئيسية كدالة عامة يمكن لاي كائن ان يستدعيها و يطبقها و فق خصوصيته. و على هذا فان عمليات الاضافة و التعديل و الحذف ممكن ان نجعل لها اكثر من نسخة في المكتبة نسخة خاصة و نسخة عامة النسخة الخاصة يعاد تطبيقها في اي كائن يستدعيها و يتم تغير المعطيات وفق حاجتنا اما النسخة العامة فيمكن تمريرها بشكل مباشر لاي كائن دون الحاجة للتغيير فيها
اتمنى ان يكون كلامي مفهوم الى هذه اللحظة و ان شاء الله سيتضح مع التطبيق الذي سنبدئه و نناقش تطويره
في البداية ساعرض جملة الادخال المعروفة لديكم لنرى ما هي الثوابت فيها , ووفق شكلها القياسي التالي
PHP كود :
INSERT INTO table_name (column1,column2,column3,...) VALUES (value1,value2,value3,...)
كما هو واضح المتغيرات الجدول و الاعمدة و قيم هذه الاعمدة و باقي النص ثابت و على هذا لو كان لدي مصفوفة من الاعمدة و القيم تمرر بدل هذه المتغيرات اكون قد ارتحت من اعادة كتابة نفس الجملة هذا من طرف الجملة , اما من طرف اطار العمل سيكون لدي كائن يقوم بتنفيذ هذه الجملة و هذا الكائن يحتاج الى اتصال و يحتاج الجملة السابقة و يحتاج الى بارمترات موافقة لعدد الحقول و قيم لهذه البارمترات و في النهاية سيقوم بالتنفيذ بعد اكتفائه بالمعلوممات المطلوبة. الان لننظر الى هذا الكود الخاص بهذا الكائن و لنكتشف ما يمكننا الاستفادة منه كائن ينفذ عملية ادخال سجل جديد في جدول
PHP كود :
Private Sub Insert_SomeData() Dim Insert_Statement As String = "INSERT INTO table_name (column1,column2,column3) VALUES (@column1, @column2, @column3)" Using Cmd As New SqlClient.SqlCommand(Insert_Statement, Con) Cmd.Parameters.AddWithValue("@column1", Txt_column1.Text) Cmd.Parameters.AddWithValue("@column2", Txt_column2.Text) Cmd.Parameters.AddWithValue("@column3", Txt_column3.Text) Con.Open() Cmd.ExecuteNonQuery() Con.Close() End Using End Sub
بعد التمعن في الكود السابق سنرى ان اغلبها ثوابت تتكرر كل مرة باستثناء ما اشرنا اليه سابقا من اسم الجدول و قائمة الحقول و القيم الموافقة لتلك الحقول و التي يشترك فيها ايضاً الكائن (Command) و حتى كائن الاتصال Con يعتبر ثابت ايضاً لاننا نعرف هذا الكائن غالباً على مستوى المشروع لذا سيكون الوصول اليه متاح من كل انحاء المشروع اذاً ما علينا في هذه الحالة ان نمرر اسم الجدول كبارميتر لهذا الاجراء و كذلك نمرر اسماء الحقول و قيمها ايضاً كبارميتر عبر مصفوفة و نكون قد تحصلنا على اجراء ادخال عام يستطيع الادخال في اي جدول بمجرد استدعائه و تمرير وسائطه المطلوبة و لو دققنا اكثر في الاجراء السابق الخاص بالاضافة سنرى انه ينفذ عملية في داخله و هي ExecuteNonQuery و التي بدورها تعيد قيمة رقمية بعد تنفيذها فهي تعيد اما 0 او 1 نجاح او فشل التنفيذ و عليه يمكننا استغلال الرقم العائد و عرض رسالة في حال نجح او فشل , و عليه فاننه يمكننا تحويل الاجراء السابق الى دالة تعيد الرسالة . و بمنطق اعمق , بما انني اضيف سجل جديد و فق الدالة السابقة فالاولى ان اتحصل على رقم السجل المضاف الى الجدول لاستفيد منه و بناءً على ذلك اريد ان اجري عملية اضافية بعد الادخال و هي تحصيل رقم السجل و فق الكود التالي
هكذا اصبحت الدالة عملية اكثر تقوم بعملية ادخال و من بعدها تعيد رقم السجل المضاف. الى هنا ينتهي غرضي من هذا التقديم لانتقل بك الى الجزء التالي
السيناريو الذي ساعمل عليه هو فتح كلاس جديد على مستوى المشروع سنقوم بادراج دوال عامة للتعامل مع العمليات السابقة مع شرح مبسط لبعضها لان الفكرة العامة قد تم شرحها باختصار في الاعلى , و بعدها سنتعامل مع قاعدة بيانات من جدولين اب و ابن و سنخصص كلاسات تمثل كل جدول و في كل كلاس سنغلف العمليات التي تجري على هذا الكائن بعد ان نرثها من الكلاس الرئيسي و نخصصها حسب الكائن , و بعدها سننشاً نموذجنا يتخاطب مع هذه الكلاسات و يقوم بالعمليات المطلوبة .
يتبع... في البداية ننشأ مشروع جديد نضيف كلاس للمشروع و نسميه DbGo او سميه ما شئت ستكون وضيفة هذا الكلاس تجميع كل ما نحتاجه من دوال و اجراءات عامة يمكن لكل الكائنات ان تستفيد منها و تعيد تطبيقها بما يناسبها
ساضيف لهذا الكلاس بعض التمهيدات الاولية كما يلي
PHP كود :
Protected Shared MyConnectionString As String = "" Protected Shared ConSql As New SqlClient.SqlConnection(MyConnectionString)
Shared Sub New(ByVal ConnectionString As String) SetConnectionString = ConnectionString If ConSql.ConnectionString = Nothing Then ConSql.ConnectionString = MyConnectionString End Sub
عند انشاء اي نسخة جديدة منه سيطلب منك تمرير نص الاتصال الخاص بالسيرفر
PHP كود :
''' <summary> ''' Set Or Get ConnectionString ''' </summary> ''' <returns></returns> Public Shared Property SetConnectionString() As String Set(value As String) MyConnectionString = value End Set Get Return MyConnectionString End Get End Property
''' <summary> ''' Close Connection To Data Base ''' </summary> Protected Shared Sub CloseConnect() If ConSql.State = ConnectionState.Open Then ConSql.Close() End If End Sub
''' <summary> ''' Open Connection To Datat Base ''' </summary> Protected Shared Sub OpenConnect() If ConSql.State = ConnectionState.Closed Then If ConSql.ConnectionString = Nothing Then ConSql.ConnectionString = MyConnectionString ConSql.Open() End If End Sub
خاصية لاسناد نص الاتصال او الحصول عليه و هي محصورة على الكائنات التي تشتق هذا الكلاس اجراء لفتح الاتصال , و اجراء لغلق الاتصال
PHP كود :
''' <summary> ''' اضافة سجل جديد الى جدول ''' </summary> ''' <param name="TableName">اسم الجدول</param> ''' <param name="Table">الجدول الذي يحوي الحقول و قيمها وهو مصفوفة</param> ''' <param name="KeyFiled">اسم حقل المفتاح الرئيسي ليتم استثنائه من جملة الاضافة</param> ''' <param name="Msg">رسالة الاضافة وهي اختيارية</param> ''' <returns>يعود بقيمة الحقل المضاف للمفتاح الرئيسي</returns> Protected Function Add_New(ByVal TableName As String, ByVal Table As Dictionary(Of String, Object), ByVal KeyFiled As String, Optional ByVal Msg As Boolean = False) As Integer
Dim Resuilt As Integer = 0 Dim Insert_Statement As String = "insert Into " & TableName & " ("
If Table.ContainsKey(KeyFiled) Then Table.Remove(KeyFiled) End If
Dim Column As String = String.Empty For X As Integer = 0 To Table.Count - 1 Column = Table.Keys.ElementAt(X) Insert_Statement += Column + "," Next ' If Insert_Statement.EndsWith(",") Then Insert_Statement = Insert_Statement.Remove(Insert_Statement.Count - 1, 1) Insert_Statement += ")" & " Values (" ' For X As Integer = 0 To Table.Count - 1 Column = Table.Keys.ElementAt(X) Insert_Statement += "@" & Column + "," Next
If Insert_Statement.EndsWith(",") Then Insert_Statement = Insert_Statement.Remove(Insert_Statement.Count - 1, 1) Insert_Statement += ")"
' OpenConnect() Using Cmd As New SqlClient.SqlCommand(Insert_Statement, ConSql) For i As Integer = 0 To Table.Count - 1 Cmd.Parameters.AddWithValue("@" + Table.Keys.ElementAt(i), Table.Values.ElementAt(i)) Next
For Each parm As SqlClient.SqlParameter In Cmd.Parameters If IsNothing(parm.Value) Or IsDBNull(parm.Value) Then parm.Value = DBNull.Value End If Next
If Msg = True Then If Resuilt > 0 Then MessageBox.Show("تمت الاضافة بنجاح", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Else MessageBox.Show("فشلت عملية الاضافة", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Resuilt = 0 End If End If End Using CloseConnect() Return Resuilt
End Function
شرح الدالة الخاصة بالاضافة وسائط الدالة هي TableName : اسم الجدول الذي سنتعامل معه Table As Dictionary : جدول البيانات الذي سنتعامل معه و هو عبارة عن مصفوفه من النوع Dictionary تحتوي على عمودين واحد اخزن فيه اسماء الاعمدة و الثاني اخزن فيه قيمة كل عمود (ستتضح اليتها مع العمل و هي بسيطة جداً) KeyFiled : اسم حقل المفتاح الرئيسي الخاص بالجدول ليتم استثنائه في عملية الاضافة Msg : متغير منطقي (بولياني) اتحكم عن طريقه بعرض رسالة الاضافة من عدمها
PHP كود :
Dim Resuilt As Integer = 0 Dim Insert_Statement As String = "insert Into " & TableName & " ("
If Table.ContainsKey(KeyFiled) Then Table.Remove(KeyFiled) End If
Dim Column As String = String.Empty For X As Integer = 0 To Table.Count - 1 Column = Table.Keys.ElementAt(X) Insert_Statement += Column + "," Next
انشاء متغير نصي يحمل جملة الاضافة بشكل ديناميكي يقوم بتجميعها وفق الوسائط المرسلة للدالة و من ثم يحذف حقل المفتاح الرئيسي من المصفوفة السابقة الخاصة بالجدول و بعدها يمر على باقي حقول الجدول و يضيفها لجملة الاستعلام
PHP كود :
If Insert_Statement.EndsWith(",") Then Insert_Statement = Insert_Statement.Remove(Insert_Statement.Count - 1, 1) Insert_Statement += ")" & " Values (" ' For X As Integer = 0 To Table.Count - 1 Column = Table.Keys.ElementAt(X) Insert_Statement += "@" & Column + "," Next
If Insert_Statement.EndsWith(",") Then Insert_Statement = Insert_Statement.Remove(Insert_Statement.Count - 1, 1) Insert_Statement += ")"
نزيل الفاصلة اخر جملة الاضافة و بعدها نمر مرة اخرى على حقول المصفوفة لنكون بارميتر لكل حقل و نضيفه لجملة الاضافة و نزيل بعدها الفاصلة الاخيرة و نكون بذلك قد كونا جملة اضافة لكل الحقول الموجودة في المصفوفة و التي تمثل حقول الجدول
PHP كود :
OpenConnect() Using Cmd As New SqlClient.SqlCommand(Insert_Statement, ConSql) For i As Integer = 0 To Table.Count - 1 Cmd.Parameters.AddWithValue("@" + Table.Keys.ElementAt(i), Table.Values.ElementAt(i)) Next
For Each parm As SqlClient.SqlParameter In Cmd.Parameters If IsNothing(parm.Value) Or IsDBNull(parm.Value) Then parm.Value = DBNull.Value End If Next
Resuilt = Cmd.ExecuteNonQuery
نفتح الاتصال و نعرف كائن Command مع الوسائط المطلوبة نضيف بارمترات لكائن الـ Command عبر المرور على عناصر المصفوفة حيث نضيف اسم البارمتر موافق لاسم الحقل و نعطيه القيمة المخزنة في العمود الثاني الخاص بقيمة العمود بعدها نقوم بالمرور على بارمترات الكائن Command و نسند القيمة Null لكل القيم الفارغة ان وجدت حتى لا نقع في مشاكل الادخالات الفارغة و اخيراً ننفذ عملية الاضافة
If Msg = True Then If Resuilt > 0 Then MessageBox.Show("تمت الاضافة بنجاح", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Else MessageBox.Show("فشلت عملية الاضافة", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Resuilt = 0 End If End If End Using CloseConnect() Return Resuilt
بعد العملية السابقة سنقوم بتحصيل رقم السجل المضاف و سنفحص قيمة المتغير البولياني و على اساسه نعرض رسالة الاضافة اخيراً نعود بقيمة السجل المضاف لنستفيد منها و نورثها للابناء
طبعاً كان بامكاننا الاستفادة من الدالة الخاصة بالموضوع السابق و نتحصل على رقم السجل الجديد قبل الاضافة , و لكن ليكون هناك تنوع بالطرق احببت السير بهذا الاتجاه
''' <summary> ''' تحديث سجل في جدول وفق قيمة حقل المفتاح الرئيسي ''' </summary> ''' <param name="TableName">اسم الجدول المراد تحديثه</param> ''' <param name="Table">الجدول الذي يحوي الحقول و قيمها وهو مصفوفة</param> ''' <param name="FiledKey">اسم حقل المفتاح الرئيسي</param> ''' <param name="ID">قيمة حقل المفتاح الرئيسي</param> ''' <param name="Msg">رسالة حفظ اختيارية</param> Protected Sub Update_Table(ByVal TableName As String, ByVal Table As Dictionary(Of String, Object), ByVal FiledKey As String, ID As Integer, Optional ByVal Msg As Boolean = False)
If FiledKey = String.Empty Then MessageBox.Show("حدد حقل المفتاح الرئيسي من فضلك", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Exit Sub End If
If Table.ContainsKey(FiledKey) Then Table.Remove(FiledKey) End If
Dim Resuilt As Integer = 0 Dim UpdatetStr As String = "Update " & TableName & " Set "
Dim Column As String = String.Empty For X As Integer = 0 To Table.Count - 1 Column = Table.Keys.ElementAt(X) UpdatetStr += Column + "=" + "@" + Column + "," Next ' If UpdatetStr.EndsWith(",") Then UpdatetStr = UpdatetStr.Remove(UpdatetStr.Count - 1, 1) UpdatetStr += " Where (" & FiledKey & " = " & "@" & FiledKey & ")" ' ' Using Cmd As New SqlClient.SqlCommand(UpdatetStr, Con)
For i As Integer = 0 To Table.Count - 1 Cmd.Parameters.AddWithValue("@" + Table.Keys.ElementAt(i), Table.Values.ElementAt(i)) Next Cmd.Parameters.AddWithValue("@" & FiledKey, ID)
For Each parm As SqlClient.SqlParameter In Cmd.Parameters If IsNothing(parm.Value) Or IsDBNull(parm.Value) Then parm.Value = DBNull.Value End If Next ' OpenConnect() Resuilt = Cmd.ExecuteNonQuery() CloseConnect()
If Msg = True Then If Resuilt > 0 Then MessageBox.Show("تم التعديل بنجاح", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Else MessageBox.Show("فشلت عملية التعديل", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) End If
End If End Using End Sub
نفس الكلام السابق سوى انها تقوم بتحديث الجدول بالمعطيات الجديدة
و في نفس الاطار يمكننا التحديث وفق مجموعة شروط , اذ يصادفك احياناً انك تريد التحديث وفق اكثر من شرط كأن تحدث طالب ما في صف محدد و شعبة محددة و كوننا لا نعرف كم عدد الشروط التي يمكن ان نحدث عن طريقها لذا رايت ان تكون لدينا مصفوفة اخرى خاصة بالشروط تحمل اسماء الاعمدة في الصف الاول و قيم الاعمدة في الصف الثاني كما يلي
PHP كود :
''' <summary> ''' تحديث جدول وفق مجموعة شروط - جدول مصفوفة ''' </summary> ''' <param name="TblNmae">اسم الجدول</param> ''' <param name="Table"> جدول يحتوي على الحقول المراد تحديثها مع قيمها - مصفوفة</param> ''' <param name="CondFileds">جدول يحتوي على الشروط المراد التحديث وفقها مع قيمها - مصفوفة</param> ''' <param name="Msg"></param> Protected Sub Update_TableByMultiCounditions(ByVal TblNmae As String, ByVal Table As Dictionary(Of String, Object), ByVal CondFileds As Dictionary(Of String, Object), Optional ByVal Msg As Boolean = False)
If Table.Count = 0 Then MessageBox.Show("املئ جدول الحقول") Exit Sub End If If CondFileds.Count = 0 Then MessageBox.Show("املئ جدول الحقول الشرطية") Exit Sub End If ' ملئ الحقول و بارمتراتها Dim UpdatetStr As String = "Update " & TblNmae & " Set " Dim Column As String = String.Empty For X As Integer = 0 To Table.Count - 1 Column = Table.Keys.ElementAt(X) UpdatetStr += Column + "=" + "@" + Column + "," Next If UpdatetStr.EndsWith(",") Then UpdatetStr = UpdatetStr.Remove(UpdatetStr.Count - 1, 1) 'ملئ الشروط و بارمتراتها UpdatetStr += " Where (" For p As Integer = 0 To CondFileds.Count - 1 UpdatetStr += "(" + CondFileds.Keys.ElementAt(p) & " = @" & CondFileds.Keys.ElementAt(p) + ")" + "And" Next If UpdatetStr.EndsWith("And") Then UpdatetStr = UpdatetStr.Remove(UpdatetStr.Count - 3, 3) ' Dim Resuilt As Integer = 0
Using Cmd As New SqlClient.SqlCommand(UpdatetStr, Con)
For i As Integer = 0 To Table.Count - 1 Cmd.Parameters.AddWithValue("@" + Table.Keys.ElementAt(i), Table.Values.ElementAt(i)) Next ' For p As Integer = 0 To CondFileds.Count - 1 Cmd.Parameters.AddWithValue("@" + CondFileds.Keys.ElementAt(p), CondFileds.Values.ElementAt(p)) Next
For Each parm As SqlClient.SqlParameter In Cmd.Parameters If IsNothing(parm.Value) Or IsDBNull(parm.Value) Then parm.Value = DBNull.Value End If Next ' OpenConnect() Resuilt = Cmd.ExecuteNonQuery() CloseConnect()
If Msg = True Then If Resuilt > 0 Then MessageBox.Show("تم التعديل بنجاح", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Else MessageBox.Show("فشلت عملية التعديل", "حفظ التعديلات", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) End If End If
End Using
End Sub
حذف سجل من جدول وفق شرط واحد (قيمة المفتاح الرئيسي)
PHP كود :
''' <summary> ''' حذف سجل من جدول وفق قيمة المفتاح الرئيسي ''' </summary> ''' <param name="TableName">اسم الجدول المراد الحذف منه</param> ''' <param name="FiledKey">اسم حقل المفتاح الرئيسي</param> ''' <param name="ID">قيمة حقل المفتاح الرئيسي</param> ''' <param name="Msg">رسالة تأكيد الحذف اختيارية</param> Protected Sub Delete_Table(ByVal TableName As String, ByVal FiledKey As String, ByVal ID As Integer, Optional ByVal Msg As Boolean = False)
If FiledKey = String.Empty Then MessageBox.Show("حدد حقل المفتاح الرئيسي من فضلك", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Exit Sub End If
Dim DeletetStr As String = "Delete From " & TableName & " Where " & FiledKey & " = " & "@" & FiledKey
Dim Result As Integer = 0
OpenConnect()
Using Cmd As New SqlClient.SqlCommand(DeletetStr, Con) Cmd.Parameters.AddWithValue("@" & FiledKey, ID) Result = Cmd.ExecuteNonQuery() End Using CloseConnect()
If Msg = True Then If Result > 0 Then MessageBox.Show("تم الحذف بنجاح", "حذف", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Else MessageBox.Show("فشلت عملية الحذف", "حذف", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) End If End If End Sub
و كذلك الحذف وفق مجموع شروط كما هو حال التحديث
PHP كود :
''' <summary> ''' حذف مجموعة سجلات من جدول وفق مجموعة شروط ''' </summary> ''' <param name="TableName">اسم الجدول المراد الحذف منه</param> ''' <param name="CondFileds">مصفوفة الشروط مع قيمها</param> ''' <param name="Msg">رسالة تأكيد الحذف اختيارية</param> Protected Sub Delete_TableByMultiCounditions(ByVal TableName As String, ByVal CondFileds As Dictionary(Of String, Object), Optional ByVal Msg As Boolean = False)
If CondFileds.Count = 0 Then MessageBox.Show("قائمة الشروط فارغة حاول ملئها اولاً", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Exit Sub End If ' If TableName = String.Empty Then MessageBox.Show("حدد اسم الجدول من فضلك", "تنبيه", MessageBoxButtons.OK, MessageBoxIcon.Stop, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Exit Sub End If ' ملئ الحقول و بارمتراتها Dim DeletetStr As String = "Delete From " & TableName & " Where " Dim Column As String = String.Empty For X As Integer = 0 To CondFileds.Count - 1 Column = CondFileds.Keys.ElementAt(X) DeletetStr += "(" + Column + "=" + "@" + Column + ")" + " And " Next If DeletetStr.EndsWith("And ") Then DeletetStr = DeletetStr.Remove(DeletetStr.Count - 5, 5) 'مصفوفة بارمترات لكوماند الحذف Dim parms As New List(Of SqlClient.SqlParameter) For i As Integer = 0 To CondFileds.Count - 1 Dim parm As New SqlClient.SqlParameter("@" & CondFileds.Keys.ElementAt(i), CondFileds.Values.ElementAt(i)) parms.Add(parm) Next ' Dim Result As Integer = 0 ' Using Cmd As New SqlClient.SqlCommand(DeletetStr, Con) 'تزويد الكوماند بالبارمترات For Each Parm As SqlClient.SqlParameter In parms Cmd.Parameters.Add(Parm) Next ' OpenConnect() Result = Cmd.ExecuteNonQuery() CloseConnect()
If Msg = True Then If Result > 0 Then MessageBox.Show("تم الحذف بنجاح", "حذف", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) Else MessageBox.Show("فشلت عملية الحذف", "حذف", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1, MessageBoxOptions.RightAlign) End If End If
End Using
End Sub
الان ناتي الى عمليات تعبئة الجدول بالبيانات , وله عدة انواع مثل الملئ العادي او الملئ وفق ترتيب محدد و بشرط او بدونه او وفق مجموع شروط
اولاً الملئ بترتيب او بدونه بدون شروط
PHP كود :
''' <summary> ''' تعبئة جدول بكامل الصفوف مع ترتيب ''' </summary> ''' <param name="TblNmae">اسم الجدول</param> ''' <param name="Table">الجدول الذي يحوي الحقول و قيمها وهو مصفوفة</param> ''' <param name="OrderBy">اسم الحقل الذي على اساسه يتم الترتيب</param> ''' <returns>يعود بجدول معبئ بالبيانات</returns> Protected Overloads Shared Function Fill_Table(ByVal TblNmae As String, ByVal Table As Dictionary(Of String, Object), Optional OrderFiled As String = Nothing, Optional OrderBy As Boolean = False) As DataTable
If Table.Count = 0 Then MessageBox.Show("املئ جدول الحقول") Return Nothing End If
If Table.Count = 0 Then MessageBox.Show("املئ جدول الحقول ") Return Nothing End If
Dim SelectStatement As String = "Select "
Dim Column As String = String.Empty For X As Integer = 0 To Table.Count - 1 Column = Table.Keys.ElementAt(X) SelectStatement += Column + "," Next
If SelectStatement.EndsWith(",") Then SelectStatement = SelectStatement.Remove(SelectStatement.Count - 1, 1) SelectStatement += " From " & TblNmae If OrderBy = True Then If Not IsNothing(OrderFiled) Then SelectStatement += " Order By " & OrderFiled Else ' MsgBox("حقل الترتيب معدوم القيمة") End If End If
Dim Dt As New DataTable Dt.Clear()
Using Cmd As New SqlClient.SqlCommand(SelectStatement, Con) Using Da As New SqlClient.SqlDataAdapter(Cmd) Da.Fill(Dt) End Using End Using
Return Dt End Function
الدالة تعيد كائن جدول معبئ بالبيانات
ثانياً الملئ وفق شرط
PHP كود :
''' <summary> ''' تعبئة جدول بحقول محددة وفق شرط ''' </summary> ''' <param name="TblNmae">اسم الجدول</param> ''' <param name="Fileds">مصفوفة الحقول</param> ''' <param name="CondFiled">شرط المطابقة / حقل</param> ''' <param name="id">قيمة الحقل الشرطي</param> ''' <returns>القيمة المعادة جدول بيانات</returns> Protected Overloads Function Fill_TableWithCoundition(ByVal TblNmae As String, ByVal Fileds As Dictionary(Of String, Object), ByVal CondFiled As String, ByVal ID As Object) As DataTable
If Fileds.Count = 0 Then MessageBox.Show("تاكد من ملئ مصفوفة الحقول") Return Nothing ElseIf TblNmae = "" Or CondFiled = "" Then MessageBox.Show("تاكد من ملئ اسم الجدول او اسم الحقل الشرطي") Return Nothing ElseIf IsNothing(ID) Then MessageBox.Show("قيمة الحقل الشرطي معدومة") Return Nothing End If
Dim SelectStatement As String = "Select "
Dim Column As String = String.Empty For X As Integer = 0 To Fileds.Count - 1 Column = Fileds.Keys.ElementAt(X) SelectStatement += Column + "," Next
If SelectStatement.EndsWith(",") Then SelectStatement = SelectStatement.Remove(SelectStatement.Count - 1, 1) SelectStatement += " From " & TblNmae & " Where " & CondFiled & " = @" & CondFiled
Dim Dt As New DataTable Dt.Clear()
Using Cmd As New SqlClient.SqlCommand(SelectStatement, Con) Cmd.Parameters.AddWithValue("@" & CondFiled, ID) Using Da As New SqlClient.SqlDataAdapter(Cmd) Da.Fill(Dt) End Using End Using
Return Dt End Function
ثالثاً الملئ وفق مجموعة شروط
PHP كود :
''' <summary> ''' تعبئة جدول بالبيانات وفق مجموعة شروط ''' </summary> ''' <param name="TableName">اسم الجدول</param> ''' <param name="CondFileds">قائمة الشروط</param> ''' <returns>يعيد جدول بيانات مملوء وفق الشروط المحددة</returns> Protected Overloads Function Fill_TableWithMultiCounditions(ByVal TableName As String, ByVal CondFileds As Dictionary(Of String, Object)) As DataTable If TableName = "" Then MessageBox.Show("تاكد من ملئ اسم الجدول") Return Nothing End If
If CondFileds.Count = 0 Then MessageBox.Show("املئ مصفوفة الحقول") Return Nothing End If
Dim Serch As String = "Select " Dim Column As String = String.Empty For X As Integer = 0 To CondFileds.Count - 1 Column = CondFileds.Keys.ElementAt(X) Serch += Column + "," Next
If Serch.EndsWith(",") Then Serch = Serch.Remove(Serch.Count - 1, 1) Serch += " From " & TableName & " Where "
For X As Integer = 0 To CondFileds.Count - 1 Column = CondFileds.Keys.ElementAt(X) Serch += "(" + Column + "=" + "@" + Column + ")" + " And " Next
If Serch.EndsWith("And ") Then Serch = Serch.Remove(Serch.Count - 5, 5) ' Dim Dt As New DataTable Dt.Clear() ' Dim parms As New List(Of SqlClient.SqlParameter) For i As Integer = 0 To CondFileds.Count - 1 Dim parm As New SqlClient.SqlParameter("@" & CondFileds.Keys.ElementAt(i), CondFileds.Values.ElementAt(i)) parms.Add(parm) Next
Using Cmd As New SqlClient.SqlCommand(Serch, Con) For Each Parm As SqlClient.SqlParameter In parms Cmd.Parameters.Add(Parm) Next
Using Da As New SqlClient.SqlDataAdapter(Cmd) Da.Fill(Dt) End Using End Using Return Dt
End Function
كل دوال الملئ تعود بجدول بيانات DataTable ساكتفي بهذا العدد من الدوال حتى الان و اذا اردت التوسع يمكنك ذلك
الخطوة التالية هي العمل على قاعدة البيانات في جانب السيرفر
09-04-17, 03:47 AM (آخر تعديل لهذه المشاركة : 09-04-17, 04:56 AM {2} بواسطة ابو ليلى.)
القاعدة ستكون على SQL Server و هي كما بالصورة مؤلفة من جدولين الطلاب و دفعات الطلاب
بعد ذلك سنضيف كلاس خاص لكل جدول في مشروعنا اضف كلاس جديد و سميه 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
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
نفس زر الاضافة و لكن المتغير البولياني حمل القيمة False دالاً على ان العملية هي تحديث بيانات
زر الحفظ
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()
الخطوات فحص حالة المتغير البولياني اذا كان 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
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
لاننا نتعامل مع كل السطور في DataGridView و لا ندري عن المستخدم هل اضاف ام عدل ام حذف لذا استوجب منا ان نفحص حالة كل سطر من سطور جدول الدفعات و معرفة حالته عبر الخاصية 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
اتمنى ان تكون الامور مفهومة و واضحة , و اتمنى من الله ان يكون هذا العمل فيه الفائدة لكم و لاتنسونا من دعواتكم بالتوفيق للجميع
لا ادري ان كانت متوفرة في نسخة 2012 ام لا
بكل الاحوال يمكنك استخدام الاختصار (. + Ctrl) اذا كانت متوفرة سيعمل الاختصار
او عليك بانشاء الخصائص يدوياً و هو المحبب لدي لانه يعطيك خبرة و مرونة في الكتابة
(10-04-17, 03:59 PM)ابو ليلى كتب : لا ادري ان كانت متوفرة في نسخة 2012 ام لا
بكل الاحوال يمكنك استخدام الاختصار (. + Ctrl) اذا كانت متوفرة سيعمل الاختصار
او عليك بانشاء الخصائص يدوياً و هو المحبب لدي لانه يعطيك خبرة و مرونة في الكتابة
تسلم يعطيك العافية يبدو انها غير متوفرة
شكرا لك
هل يمكن اخي الفاضل / ابو اليلى
ان ترفع المثال كي اطبق خطوة خطوة واراجع عملي بنفسي