السلام عليكم و رحمة الله و بركاته
الاخ الكريم,
بما ان المثال لديك اعتمد على الجداول في مثالي السابق , فلن اتكلم كثيراً عنه.
لكن ما الفائدة من كتابة نمط ثابت اقصد طريقة انشاء Properitys عن طريقة كتابتها يدوياً في الكود البرمجي.
ليس من فائدة تذكر لانك تستطيع استخدام زر التاب مرتين و يقوم المحرر بانشاء الخصائص بسرعة لك او عن طريق المؤشر الذكي في المحرر.
ما يهمني صراحة هو استخدام الفئات المتقدمة في قلب اللغة لتقوم هي بانشاء الخصائص و الانواع و كل شيئ احتاجه عن طريق فئة قاعدية انا اقوم ببرمجتها و توريثها و هي تتكفل بباقي العمل (Reflection) هي الحل لهذا الموضوع
بطريقة بسيطة يمكنني اختصار الكثير مما سبق في مثالي وفق مثال ساقدم شرح بسيط عنه هنا.
من جهة اخرى يجب ان تمتلك طريقة لتقوم وحدها بالتعرف على الجدول و حقوله و انواع الحقول فيه و تقوم هي نفسها باجراء عمليات التحويل لتتطابق مع انواع اللغة و ما يقابلها (اعرف انك تملك الطريقة) و انتظر منك ان تقوم بها بالشكل الاوسع في مثالك القادم.
ما رايته في المثال بسيط و هو بمثابة كتابة اسطر و نسخها الى الواجهة (لديك اكثر من ذلك) فقط افرج عنه
----------------------------------------------------------------------
بالنسبة للمثال الذي اقصده تابع معي هذه الكلاسات البسيطة و ستعرف ما اقصده عند دراسته.
مثلاً لدي برنامج لاحد الاخوة و هو يخص عمله (المثال هنا مختصر).
يتالف من 3 جداول (جدول تصنيفات-جدول محتوى - جدول حلقات او اجزاء)
البرنامج لهاوي مسلسلات و افلام بالمختصر
الجداول الثلاثة تنشئ عبر كلاسات بسيطة وفق ما يلي.
كما تلاحظ لم ادخل في اي نوع من الخصائص او غيرها مجرد حقول بسيطة.
الان ننتقل الى الفئة القاعدية المسؤولة عن العمل
اضف مديول (Module) كما بالشكل التالي , المديول ليس لها علاقة بعملنا و فكرتنا و لكن ليعمل معك المثال فقط
الان ناتي الى النموذج , ادرج نموذج و ضع عليه 3 كائنات DataGridView
كل واحد يخص جدول محدد
كود النموذج
الكود يتعامل مع قاعدة بيانات Xml لكي لا ندخل في قواعد بيانات
الكود هنا مبسط لغرض انارة حول تقنية Reflection .
ادرس Reflection جيدأ و سترى اكوادك اصبحت قادرة على انجاز اشياء لم تتصورها بهذه السهولة.
من الاضافات الجميلة استخدمتها في احد المشاريع
اذا كنت تحب التجميل
الاخ الكريم,
بما ان المثال لديك اعتمد على الجداول في مثالي السابق , فلن اتكلم كثيراً عنه.
لكن ما الفائدة من كتابة نمط ثابت اقصد طريقة انشاء Properitys عن طريقة كتابتها يدوياً في الكود البرمجي.
ليس من فائدة تذكر لانك تستطيع استخدام زر التاب مرتين و يقوم المحرر بانشاء الخصائص بسرعة لك او عن طريق المؤشر الذكي في المحرر.
ما يهمني صراحة هو استخدام الفئات المتقدمة في قلب اللغة لتقوم هي بانشاء الخصائص و الانواع و كل شيئ احتاجه عن طريق فئة قاعدية انا اقوم ببرمجتها و توريثها و هي تتكفل بباقي العمل (Reflection) هي الحل لهذا الموضوع
بطريقة بسيطة يمكنني اختصار الكثير مما سبق في مثالي وفق مثال ساقدم شرح بسيط عنه هنا.
من جهة اخرى يجب ان تمتلك طريقة لتقوم وحدها بالتعرف على الجدول و حقوله و انواع الحقول فيه و تقوم هي نفسها باجراء عمليات التحويل لتتطابق مع انواع اللغة و ما يقابلها (اعرف انك تملك الطريقة) و انتظر منك ان تقوم بها بالشكل الاوسع في مثالك القادم.
ما رايته في المثال بسيط و هو بمثابة كتابة اسطر و نسخها الى الواجهة (لديك اكثر من ذلك) فقط افرج عنه
----------------------------------------------------------------------
بالنسبة للمثال الذي اقصده تابع معي هذه الكلاسات البسيطة و ستعرف ما اقصده عند دراسته.
مثلاً لدي برنامج لاحد الاخوة و هو يخص عمله (المثال هنا مختصر).
يتالف من 3 جداول (جدول تصنيفات-جدول محتوى - جدول حلقات او اجزاء)
البرنامج لهاوي مسلسلات و افلام بالمختصر
الجداول الثلاثة تنشئ عبر كلاسات بسيطة وفق ما يلي.
PHP كود :
Public Class tblCategory
Public id As Integer
Public CategoryName As String
End Class
PHP كود :
Public Class tblSubVideo
Public id As Integer
Public SubVideo As String
Public LinkVideo As String
Public VideoId As Integer
End Class
PHP كود :
Public Class tblVideo
Public id As Integer
Public VideoName As String
Public CategoryId As Integer
End Class
الان ننتقل الى الفئة القاعدية المسؤولة عن العمل
PHP كود :
Imports System.Reflection
Public Class Cls_TableBase(Of Cls_TableBase)
Public TableName As String
Public Entry As String
Public Table As DataTable
Public Sub New()
TableName = GetType(Cls_TableBase).Name
Entry = TableName.Remove(0, 3)
TableFromFileds()
End Sub
Private Function TableFromFileds() As DataTable
Dim Types() As String = {"Int32", "Int64", "String", "Object", "DateTime", "Date"}
Table = New DataTable(GetType(Cls_TableBase).Name)
Dim MyField As FieldInfo() = GetType(Cls_TableBase).GetFields()
For i As Integer = 0 To MyField.Length - 1
If Types.Contains(MyField(i).FieldType.Name) Then
Dim Column As New DataColumn With {.ColumnName = MyField(i).Name, .DataType = MyField(i).FieldType}
If Not Table.Columns.Contains(Column.ColumnName) Then
If MyField(i).Name = "id" And MyField(i).FieldType.Name = "Int32" Then
With Column
.AutoIncrement = True
.AutoIncrementSeed = 1
.AutoIncrementStep = 1
.AllowDBNull = False
End With
End If
Table.Columns.Add(Column)
End If
End If
Next i
Return Table
End Function
PHP كود :
Module ML_MyExten
Dim Myds As New DataSet()
Public Function GenrateDataset(Table As DataTable) As DataSet
Myds.Namespace = "AboLayla"
If Not (Myds.Tables.Contains(Table.TableName)) Then
Myds.Tables.Add(Table)
End If
Return Myds
End Function
<Runtime.CompilerServices.Extension>
Public Sub GenrateRelations(DS As DataSet)
If Myds.Tables.Count = 3 Then
Dim Relation1 As DataRelation = New DataRelation("Re1", Myds.Tables(0).Columns("id"), Myds.Tables(1).Columns(2))
Myds.Relations.Add(Relation1)
Dim foreignKey1 As ForeignKeyConstraint = Relation1.ChildKeyConstraint
foreignKey1.DeleteRule = Rule.Cascade
foreignKey1.UpdateRule = Rule.Cascade
foreignKey1.AcceptRejectRule = AcceptRejectRule.Cascade
Dim Relation2 As DataRelation = New DataRelation("Re2", Myds.Tables(1).Columns("id"), Myds.Tables(2).Columns(3))
Myds.Relations.Add(Relation2)
Dim foreignKey2 As ForeignKeyConstraint = Relation2.ChildKeyConstraint
foreignKey2.DeleteRule = Rule.Cascade
foreignKey2.UpdateRule = Rule.Cascade
foreignKey2.AcceptRejectRule = AcceptRejectRule.Cascade
End If
End Sub
End Module
كل واحد يخص جدول محدد
كود النموذج
PHP كود :
Imports System.Xml
Public Class Form1
Dim Catogary As New Cls_TableBase(Of tblCategory)
Dim Video As New Cls_TableBase(Of tblVideo)
Dim SubVideo As New Cls_TableBase(Of tblSubVideo)
Dim Path As String = Application.StartupPath + "\DB.xml"
Shared DS As New DataSet
Dim BnCat, BnVideo, BnSubvideo As New BindingSource
Private Sub BtnSaveXml_Click(sender As Object, e As EventArgs) Handles BtnSaveXml.Click
DS.WriteXml(Path)
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
DS = GenrateDataset(Catogary.Table)
DS = GenrateDataset(Video.Table)
DS = GenrateDataset(SubVideo.Table)
DS.GenrateRelations()
If Not IO.File.Exists(Path) Then
DS.WriteXml(Path)
End If
BnCat.DataSource = DS.Tables(Catogary.TableName)
BnVideo.DataSource = BnCat
BnVideo.DataMember = "Re1"
BnSubvideo.DataSource = BnVideo
BnSubvideo.DataMember = "Re2"
DataGridView1.DataSource = BnCat
DataGridView2.DataSource = BnVideo
DataGridView3.DataSource = BnSubvideo
If IO.File.Exists(Path) Then
DS.ReadXml(Path)
End If
GenrateDataGridViewStyle(DataGridView1, {"id"})
GenrateDataGridViewStyle(DataGridView2, {"id", "CategoryId"})
GenrateDataGridViewStyle(DataGridView3, {"id", "VideoId"})
End Sub
Private Sub CreateDoc()
If Not IO.File.Exists(Application.StartupPath + "\DB.xml") Then
Dim Doc As New XmlDocument
Doc.AppendChild(Doc.CreateElement("tblCategory"))
For Each column As DataColumn In Catogary.Table.Columns
Doc.DocumentElement.AppendChild(Doc.CreateElement(column.ColumnName))
Next
Doc.Save(Application.StartupPath + "\DB.xml")
Doc = Nothing
End If
End Sub
Private Sub GenrateDataGridViewStyle(Dgv As DataGridView, ColumnsToHide() As String)
Dgv.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
If Dgv.Columns.Count > 0 Then
For Each column As DataGridViewColumn In Dgv.Columns
If ColumnsToHide.Contains(column.Name) Then
column.Visible = False
Else
column.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
End If
Next
End If
End Sub
End Class
الكود هنا مبسط لغرض انارة حول تقنية Reflection .
ادرس Reflection جيدأ و سترى اكوادك اصبحت قادرة على انجاز اشياء لم تتصورها بهذه السهولة.
من الاضافات الجميلة استخدمتها في احد المشاريع
اذا كنت تحب التجميل
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال


