اخوانى هذا المثال والشرح اقتبسته من الأخ (samerselo) مشرف فى منتدى الفيجوال بيزك حيث أن الشرح الأساسى مشروح بال VB.NET ولكنى هنا سوف أستخدم ال C#
وهذا هو الرابط فى منتدى الفيجوال بيزك
http://vb4arab.com/vb/showthread.php?t=13315
نبدأ باسم الله
الهدف من المثال
1. حفظ بيانات DataSet في ملف xml واستعادتها منه والتعامل معها بدون الحاجة لوجود قاعدة بيانات
2. الاستعلام من الـ DataSet باستخدام Linq ومن أكثر من جدول وإدخال بعض الحسابات في جملة الاستعلام واستخدام عبارة Join لمنع التكرار الخاطئ للبيانات
3. استخدام Lambda Expressions للقيام بالحسابات من أجلنا والاستفادة من ميزة رفع المتغيرات
4. إظهار نتيجة استعلام Linq في DataGridView مباشرة
من أجل ترك الموضوع عام وبما أن مجموعة البيانات DataSet يمكن ربطها مع أي قاعدة بيانات سأقوم بالعمل على مجموعة بيانات غير مربوطة مع قاعدة بيانات حيث يمكنك تطبيق الأفكار الواردة هنا على أي قاعدة بيانات يمكن ربطها مع أي DataSet وسيكون مثالي الذي سنسير عليه هنا معتمد على خدمة مصرفية تدعى بالودائع لأجل
افتح أي إصدار من فيجول ستوديو 2008 وأنشئ مشروعا جديدا من نوع Windows Forms Application ثم من قائمة Project اختر الأمر Add New Item وأضف DataSet للمشروع وقم بتسميتها MyDataSet
في محرر التصميم الرسومي لمجموعة البيانات انقر بزر الفأرة اليميني واختر الأمر DataTable من قائمة Add في قائمة السياق ثم قم بإعادة تسميته ليصبح اسمه Customers
أضف للجدول Customers الحقول التالية مع الخصائص الموضحة
الحقل ID الخاصية AutoIncrement بالقيمة True والخاصيتان AutoIncrementSeed و AutoIncrementStep كلتاهما إلى القيمة 1 و نوع البيانات System.Int32 ثم انقر بزر الفأرة اليميني على الحقل ID واختر الأمر Set Primary Key من قائمة السياق لتحديد الحقل كمفتاح أساسي
الحقل CustomerName نوع البيانات System.String و MaxLength بالقيمة 25
الحقل CurrentAccountNumber نوع البيانات System.String و MaxLength 25
حيث أن الحقل ID هو معرف الزبون و CustomerName هو اسم الزبون والحقل CurrentAccountNumber هو رقم الحساب الجاري لدى المصرف
أضف جدول آخر لمجموعة البيانات باسم Wadaeaa وأضف له الحقول التالية
الحقل WadeaaNumber بنوع بيانات String
الحقل CustomerID بنوع بيانات Int32
الحقل InterestRate بنوع بيانات Decimal و NullValue مساوية لـ 7.5
الحقل WadeeaPeriod بنوع بيانات Int16 و BullValue مساوية لـ 3
الحقل StartDate بنوع بيانات DateTime
الحقل WadeaaAmount بنوع بيانات Int32 و NullValue بقيمة 10000
حيث WadeaaNumber هو رقم الوديعة و CustomerID هو حقل مرتبط بجدول الزبائن و InterestRate نسبة الفائدة و WadeeaPeriod فترة الوديعة بالأشهر و StartDate تاريخ فتح الوديعة و WadeaaAmount قيمة الوديعة
سنضيف الآن علاقة بين الجدولين: انقر بزر الفأرة اليمني على الجدول Customers ومن القائمة الفرعية Add اختر Relation ثم اضبط Parent Table إلى Customers و Child Table إلى Wadaeaa ثم اختر Key Columns ليضم الحقل ID فقط و Foreign Key Columns ليضم الحقل CustomerID فقط ثم اختر الخيار Both Relations And Foreign Key Constraint ثم اضغط Ok من أجل حفظ العلاقة ثم اختر الأمر Save All من القائمة File
انتقل إلى محرر النماذج الخاص بـ Form1 واجعل مساحة Form1 كبيرة كفاية لتتسع لـ 2 × DataGridView مع شريط أدوات وبعض التحكمات الأخرى التي سنضيفها لاحقا ثم انتقل لنافذة Data Sources واسحب الجدول Customers ثم ألقه على سطح Form1 فيتم إضافة DataGridView و شريط أدوات للنافذة
من نافذة Data Sources انقر إشارة + بجانب الجدول Customers لتظهر لك قائمة بالحقول الخاصة به كما نلاحظ وجود نسخة من الجدول Wadaeaa كجدول فرعي ضمن Customers وذلك بسبب العلاقة التي قمنا بإنشائها بين الجدولين الآن قم بسحب الجدول Wadaeaa الموجود كجدول فرعي لـ Customers وليس الجدول الخارجي إلى سطح Form1 ليتم إنشاء DataGridView أخرى على النافذة ثم قم بتنسيق النافذة بشكل جيد وتأكد من أن الـ DataGridView الخاصة بـ Customers في الأعلى و الأخرى في الأسفل
اختر CustomersDataGridView وانقر على السهم الصغير الذي يظهر في زاويتها اليمينية العليا واختر الأمر Edit Columns واضبط الخاصية Visible للحقل ID إلى False ثم كرر العملية بالنسبة للحقل CustomerID في WadaeaaDataGridView
في شريط الأدوات في الأعلى انقر بزر الفأرة اليميني على زر الحفظ – يمتلك أيقونة قرص – واختر الأمر Enabled لتفعيله ثم انقر عليه نقرا مزدوجا لننتقل إلى محرر الكود ثم أدخل الكود التالي في حدث النقر على زر الحفظ حيث نستخدم الوظيفة WriteXml لتخزين محتويا مجموعة البيانات في ملف xml
private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
try
{
myDataSet.WriteXml(@"c:\TestData.xml");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}نشئ إجراء لمعالجة الحدث Load للنموذج وأدخل فيه الكود التالي الذي سيقوم بتحميل البيانات من ملف xml لاحظ ظهور رسالة خطأ عند تشغيل البرنامج لأول مرة وقبل حفظ البيانات حيث أن ملف البيانات لم يتم إنشاؤه بعد وهذا السبب في استخدام بلوك Try … Catch من أجل اصطياد الخطأ وتجنب إفشال عملية بدء البرنامج وقد استخدمنا الوظيفة ReadXml لتحميل البيانات من ملف xml إلى مجموعة البيانات
private void Form1_Load(object sender, EventArgs e)
{
try
{
myDataSet.Clear();
myDataSet.ReadXml(@"c:\TestData.xml");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}