عرب تك
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

اذهب الى الأسفل
avatar
tarik
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012

الوضع المتصل والوضع المنفصل - ربط جدولين في الوضع المنفصل باستخدام كومبوبوكس و داتاجريدفيو. Empty الوضع المتصل والوضع المنفصل - ربط جدولين في الوضع المنفصل باستخدام كومبوبوكس و داتاجريدفيو.

الخميس أكتوبر 10, 2013 6:59 pm

[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]

تقديم :
في هذا الجزء إن شاء الله, سنقوم بدراسة مثال نربط خلاله جدولين في الوضع المنفصل باستخدام مربع كومبوبوكس و داتاجريدفيو. كما توضح الصورة أعلاه, سيكون لدينا على النموذج مربع كومبوبوكس بلائحة المجموعات GroupInfo التي يمكن أن ينتمي إليها مستخدم مسجل على جدول المستخدمين UserInfo. بالإضافة إلى الكومبوبوكس, هناك داتاجريدفيو تظهر لنا لائحة المستخدمين المسجلين و لكن فقط الذين ينتمون إلى المجموعة المختارة و الظاهرة على كومبوبوكس المجموعات. في كل مرة نقوم باختيار مجموعة أخرى تظهر فقط أسماء المستخدمين الذين ينتمون إليها و تختفي أسطر باقي المستخدمين من المجموعات الأخرى.
بالنسبة للقراء الذين انتقلوا مباشرة إلى هذا الجزء, أنصحهم بقراءة الأجزاء الماضية من هذا الدرس لأننا لن نتطرق بالتفصيل لعمليات تحميل البيانات من القاعدة.

في هذا الجزء, سنستعمل فئة جديدة تمكننا من ربط الجداول بينها و الوصول فقط إلى الأسطر التي تدخل ضمن العلاقات المحددة بين الجداول DataTable. هذه الفئة هي BindingSource. الـ BindingSource هي حاوية لمصدر بيانات من أي نوع تسهل عمليات الربط بين مصدر البيانات و مربعات التحكم على نموذج ما و تسهل عمليات الانتقال بين أسطر أو عناصر مصدر البيانات. الـ BindingSource تمكن أيضا من ترتيب أسطر مصدر البيانات و تنفيذ فلتر عليها.
طريقة ربط الجدولين التي سنتكلم عنها في هذا الجزء تنقسم إلى قسمين, القسم الأول نقوم فيه بزيادة علاقة بين الجدولين GroupInfo الأب و UserInfo الإبن عن طريق المناداة على الدالة Add لمجموعة علاقات الجدول DataTable.ChildRelations و تضمين كائن من فئة DataRelation الذي نحدد من خلاله اسم العلاقة و عمودي ربط الجدول الأب بالإبن. القسم الثاني ننشئ فيه الـ BindingSource الأول للجدول GroupInfo و نهيئه ليكون حاوية لـ DataTable الممثلة للجدول. بعد ذلك نقوم بإنشاء BindingSource أخرى للعلاقة التي قمنا بإنشائها و نهيئه ليكون حاوية لأسطر الجدول UserInfo المرتبطة بالمجموعة الحالية على حاوية الجدول GroupInfo أي DataTable الجدول. بهذه الطريقة, سنظمن أن حاوية الأسطر UserInfo المرتبطة بحاوية جدول المجموعات GroupInfo ستمكننا فقط من الوصول إلى الأسطر المرتبطة بين السطر الحالي للـ GroupInfo و أسطر UserInfo.

تعريفات :
نبدأ مع تعريف حاوية جدول المجموعات ثم تعريف حاوية الأسطر المرتبطة بين الجدولين المجموعات و المستخدمين.


الكود:

 ' حاوية بيانات جدول المجموعات
 Dim GroupInfoBindingSource As BindingSource
 ' حاوية بيانات جدول المستخدمين
 Dim FKGroupsUsersBindingSource As BindingSource


بعد ذلك, نقوم بتعريف كائن مدير العمليات بين التطبيق و قاعدة البيانات ثم حاوية الجداول.


الكود:

 ' كائن تحميل, تحرير, زيادة و حذف المعلومات
 Dim MyAdapter As New OleDbDataAdapter
 ' الداتاست التي ستكون الحاوية للجداول التي سيملأها الكائن مايأدابتر
 Dim MyDataSet As DataSet



تحميل البيانات :
تحميل البيانات يتم وقت تشغيل التطبيق أي داخل دالة الحدث Load. الشرح بالتفصيل لعملية تحميل البيانات في الوضع المنفصل تعرضنا لها بالتفصيل في الجزء الثاني من هذا الدرس.


الكود:

 ' جملة الربط
 Dim ConString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source =.\AccessDB.mdb"
 ' إنشاء الكائن و تهيئته بكائن الربط و جملة الإستعلام
 MyAdapter = New OleDbDataAdapter("SELECT * FROM UserInfo", ConString)
 ' تهيئة كائن جملة تحرير التسجيلات مع البرامترز
 MyAdapter.UpdateCommand = New OleDbCommand("UPDATE UserInfo SET [Login] = @Login, [Password] = @Password, GroupID = @GroupID WHERE ID = @ID", MyAdapter.SelectCommand.Connection)
 MyAdapter.UpdateCommand.Parameters.Add("@Login", OleDbType.WChar, 32, "Login")
 MyAdapter.UpdateCommand.Parameters.Add("@Password", OleDbType.WChar, 32, "Password")
 MyAdapter.UpdateCommand.Parameters.Add("@GroupID", OleDbType.BigInt, 1, "GroupID")
 MyAdapter.UpdateCommand.Parameters.Add("@ID", OleDbType.BigInt, 1, "ID")
 ' تهيئة كائن أمر الحدف مع البرمتر مرجع التسجيل المراد حذفه
 MyAdapter.DeleteCommand = New OleDbCommand("DELETE FROM UserInfo WHERE ID = @ID", MyAdapter.SelectCommand.Connection)
 MyAdapter.DeleteCommand.Parameters.Add("@ID", OleDbType.BigInt, 1, "ID")
 ' تهيئة كائن أمر زيادة التسجيلات من الداتاست إلى الجدول على قاعدة البيانات
 MyAdapter.InsertCommand = New OleDbCommand("INSERT INTO UserInfo ([Login], [Password], GroupID) VALUES(@Login, @Password, @GroupID)", MyAdapter.SelectCommand.Connection)
 MyAdapter.InsertCommand.Parameters.Add("@Login", OleDbType.WChar, 32, "Login")
 MyAdapter.InsertCommand.Parameters.Add("@Password", OleDbType.WChar, 32, "Password")
 MyAdapter.InsertCommand.Parameters.Add("@GroupID", OleDbType.BigInt, 1, "GroupID")
 ' إنشاء و تهيئة الداتاست
 MyDataSet = New DataSet("AccessDB")
 ' تحميل تسجيلا الجدول من قاعدة البيانات إلى الداتاست
 MyAdapter.Fill(MyDataSet, "UserInfo")

 ' تحميل بيانات أسماء المجموعات
 Dim adptr As New OleDbDataAdapter("SELECT * FROM GroupInfo", MyAdapter.SelectCommand.Connection)
 adptr.Fill(MyDataSet, "GroupInfo")
 adptr.Dispose()



تحديد العلاقات بين الجدولين :
أولا, نقوم بربط الجدول الأب GroupInfo عبر العمود ID بالجدول الإبن UserInfo عبر العمود GroupInfo.


الكود:

 ' إنشاء علاقة بين الجدول الأب و الجدول الإبن
 MyDataSet.Tables("GroupInfo").ChildRelations.Add(New DataRelation("FK_GroupInfo_UserInfo", _
 MyDataSet.Tables("GroupInfo").Columns("ID"), _
 MyDataSet.Tables("UserInfo").Columns("GroupID")))


بعد ذلك, نقوم بتهيئة كائن حاوية الجدول الأب GroupInfo


الكود:

 ' تهيئة حاوية بيانات جدول المجموعات
 GroupInfoBindingSource = New BindingSource(MyDataSet, "GroupInfo")



بعد ذلك نقوم بتهيئة كائن حاوية العلاقة بين الجدولين التي قمنا بتحديدها أعلاه. لاحظوا معي اسم الربط DataMember الذي سيأخده كائن BindingSource الجديد الذي يتمتل في اسم العلاقة التي أنشأناها أعلاه و لاحظوا معي اسم مصدر البيانات للحاوية الجديدة الذي يتمثل في حاوية الجدول الأب الذي أنشأناه للتو أي GroupInfoBindingSource.


الكود:

 ' تهيئة حاوية البيانات المشتركة بين بيانات المجموعات و المستخدمين
 FKGroupsUsersBindingSource = New BindingSource(GroupInfoBindingSource, "FK_GroupInfo_UserInfo")


الآن و قد أتممنا تحديد العلاقة بين الجدولين الأب و الإبن نستطيع ربط الكومبوبوكس التي ستحوي لائحة المجموعات للجدول الأب و الداتاجريدفيو التي ستظهر الأسطر المرتبطة بالسطر الحالي لحاوية الجدول الأب.


الكود:

 ' ربط العمود بجدول أسماء المجموعات
 ComboBox1.DataSource = GroupInfoBindingSource
 ComboBox1.DisplayMember = "Name"
 ComboBox1.ValueMember = "ID"

 ' ربط الداتاجريدفيو مع حاوية البيانات المرتبطة بين جدولي المستخدمين و المجموعات
 ' حتى يظهر فقط أسطر المستخدمين الذين ينتمون إلى المجموعة المظهرة على الكومبوبوكس
 DataGridView1.DataSource = FKGroupsUsersBindingSource
 ' منع الكتابة على خلايا عمود المرجع
 DataGridView1.Columns("ID").ReadOnly = True
 DataGridView1.Columns("GroupID").Visible = False


لاحظوا معي أننا ربطنا المربعين بحاويتي البيانات BindingSource و ليس مباشرة مع الجدولين DataTable.


اشتغال التطبيق :
الآن و قد انتهت عملية تحميل البيانات و تحديد العلاقة بين الجدولين, سيظهر النموذج و عليه الكومبو محدد عليه اسم أول مجموعة و على الداتاجريدفيو أسطر المستخدمين الذين ينتمون إلى المجموعة. إذا قمنا بتحديد مجموعة أخرى على الكومبو تختفي أسطر الداتاجريدفيو الحالية و تظهر أسطر المستخدمين المنتمين للمجموعة الجديدة.
إذا تتذكرون بنية قاعدة البيانات و الجدولين. تعرفون أن الجدول UserInfo مرتبط مع الجدول GroupInfo عبر الحقل GroupID أي أن مجموعة المستخدم تعرف بـ GroupInfo.ID = UserInfo.GroupID. عند زيادة سطر جديد على الداتاجريدفيو يقوم إطار الدوت نت بربط السطر الجديد للـ UserInfo بسطر المجموعة الحالية GroupInfo المحدد على الكومبوبوكس عن طريق التحديد الأوتوماتيكي للحقل UserInfo.GroupID للسطر الجديد بمرجع سطر المجموعة الحالية. هذا يعني أنه زيادة للدعم الأوتوماتيكي لعمليات الزيادة, التحديث و الحذف من طرف الداتاجريدفيو نجد الدعم الأوتوماتيكي لربط الأسطر الجديدة للجداول الأبناء مع أسطر الجداول الآباء التي تربطهم علاقة تم تحديدها كما قمنا بذلك أعلاه.

حفظ المعلومات :
وقت إغلاق التطبيق, نقوم بحفظ المعلومات من الذاكرة الحية رجوعا نحو قاعدة البيانات.


الكود:

 ' إذا كانت هناك تغييرات
 If MyDataSet.HasChanges() Then
 Me.Validate()
 ' حفظ التغييرات في جدول المستخدمين على قاعدة البيانات
 MyAdapter.Update(MyDataSet.Tables("UserInfo"))
 End If



خاتمة :
رأينا في هذا الجزء كيفية ربط جدولين في الوضع المنفصل باستخدام الفئة BindingSource و العلاقات DataRelation. في الجزء التالي سوف نقوم بتحرير المشروع المرفق مع هذا الدرس ليعمل نفس العمل و لكن في الوضع المتصل. و كل هذا حتى يتم فك الخلط الحاصل بين الوضعين المتصل و المنفصل.
الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى