تقييم الموضوع :
  • 3 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
RE: مشروع للتعامل مع قاعدة بيانات DataGridView باللغتين VB و#C
#1
السلام عليكم ورحمة الله


مشروع للتعامل مع قاعدة بيانات بها ثلاث جداول بينهم علاقات، مع إمكانية:
الإضافة
التعديل
الحذف
البحث


الخطوة الأولى: عمل قاعدة بيانات Microsoft Access بإسم Database1.accdb ونحفظه في مجلد المستندات وبه الجداول والأعمدة التالية:

جدول الموظفين Employees والأعمده هي:
رقم الموظف Emp_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم الموظف Emp_Name نوع نص
رقم الفرع Brn_ID نوع رقم
رقم القسم Dpt_ID نوع رقم

جدول الفروع Branches والأعمده هي:
رقم الفرع Brn_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم الفرع Brn_Name نوع نص

جدول الأقسام Departments والأعمده هي:
رقم القسم Dpt_ID نوع ترقيم تلقائي ومفتاح أساسي
إسم القسم Dpt_Name نوع نص

إنشاء علاقات بين الجداول الثلاث كالتالي:
Employees.Brn_ID = Branches.Brn_ID
Employees.Dpt_ID = Departments.Dpt_ID

ونحن داخل Microsoft Access نقوم بإضافة بعض البيانات في جدول الفروع Branches وجدول الأقسام Departments


الخطوة الثانية: عمل مشروع Visual Basic جديد

إضافة قاعدة البيانات Database1.accdb للمشروع:
من القائمة Project نختار Add Existing Item ستفتح نافذة تحديد الملفات
ولنستطيع مشاهدة ملفات قاعدة البيانات لابد من تغيير نوع عرض الملفات إلى Data Files، ثم نبحث عن الملف ونحدده ونضغط Add،
وبما أن الملف الذي اخترناه هو قاعدة بيانات فستفتح لنا نافذة معالج إعداد مصدر البيانات Data Source Configuration Wizard،
نحدد من النماذج المعروضة (وفي الغالب هو نموذج واحد Dataset مع ال Access) النموذج Dataset ونضغط التالي Next،
سننتقل للصفحة التالة للمعالج وهي تحديد كائنات من قاعدة البيانات وغالباً سنؤشر على الجداول فقط Tables والتي
تشمل الثلاث جداول Branches وDepartments وEmployees، وسنترك الإسم الإفتراضي Database1DataSet كما هو ثم نضغط إنهاء Finish.

سنجد أنه تم إضافة الملفات التالية للمشروع:
app.config ويحتوى على معلومات عن الإتصال قاعدة البيانات.
Database1.accdb وهو ملف قاعدة البيانات.
Database1DataSet.xsd وهو يحتوى على مخطط للجداول مع العلاقات التي بينهم (بإمكانك فتحه بالنقر مرتين عليه لمشاهدت ما فيه من باب العلم)

نأتي للنموذج Form1:
نقوم بإضافة الأداة DataGridView1 ونقوم بربطها بالجداول كالتالي:

نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1
وستفتح لنا Choose Data Source
ونقوم بفتح الشجرة Other Data Sources حتى نشاهد الثلاث جدوال السابقة
ونختار الجدول Employees
وسوف نشاهد أن أعمدة الجدول ظهرت في أداة DataGridView1،

وسنجد أن العمودين Brn_ID وDpt_ID ظهرا على أساس نوع TextBox
وسنقوم بتغييرهم إلى نوع ComboBox في الخطوة التالية.

لتغيير نوع عمود الفرع Brn_ID من نوع TextBox إلى نوع ComboBox بحيث يحتوي على أسماء الفروع من الجدول Branches نقوم بالتالي:

نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1 ونضغط على تعديل الأعمدة Edit Columns،
من نافذة تعديل الأعمدة نحدد العمود Brn_ID فتظهر خصائصه،

نذهب للخاصية Column Type ونغيره من DataGridViewTextBoxColumn إلى DataGridViewComboBoxColumn
فتظهر لنا بعض الخصائص الإضافية التي لم تكن موجودة قبل هذا التغيير،

نذهب للخاصية DataSource ونفتح بالترتيب Other Data Sources ثم Project Data Sources ثم Database1DataSet
وستظهر فيها الثلاث جداول ونختار جدول الفروع Branches،

نذهب للخاصية DisplayMember ونختار منها Brn_Name،

نذهب للخاصية ValueMember ونختار منها Brn_ID،

نذهب للخاصية HeaderText ونغيره إلى Branch.

لتغيير نوع عمود القسم Dpt_ID من نوع TextBox إلى نوع ComboBox بحيث يحتوي على أسماء الأقسام من الجدول Departments نقوم بالتالي:

نحدد الأداة DataGridView1 ثم نضغط على السهم الصغير الموجود في ركن الأداة DataGridView1 ونضغط على تعديل الأعمدة Edit Columns،
من نافذة تعديل الأعمدة نحدد العمود Dpt_ID فتظهر خصائصه،

نذهب للخاصية Column Type ونغيره من DataGridViewTextBoxColumn إلى DataGridViewComboBoxColumn
فتظهر لنا بعض الخصائص الإضافية التي لم تكن موجودة قبل هذا التغيير،

نذهب للخاصية DataSource ونفتح بالترتيب Other Data Sources ثم Project Data Sources ثم Database1DataSet
وستظهر فيها الثلاث جداول ونختار جدول الأقسام Departments،

نذهب للخاصية DisplayMember ونختار منها Dpt_Name،

نذهب للخاصية ValueMember ونختار منها Dpt_ID،

نذهب للخاصية HeaderText ونغيره إلى Department.

ويمكنك تغيير اسماء الأعمدة التي تظهر في الأداة DataGridView1 عن طريق الخاصية HeaderText لكل عمود.

الأن لو فتحنا نافذة الكود الخاص بالنموذج Form1 فسنجد أن المعالج أضاف ثلاث أسطر في حدث تحميل النموذج Form1_Load وهي أسطر قراءة الجداول الثلاث
VB
PHP كود :
Private Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load

    Me
.DepartmentsTableAdapter.Fill(Me.Database1DataSet.Departments)
 
   Me.BranchesTableAdapter.Fill(Me.Database1DataSet.Branches)
 
   Me.EmployeesTableAdapter.Fill(Me.Database1DataSet.Employees)

End Sub 
#C
PHP كود :
private void Form1_Load(object senderEventArgs e) {

 
   this.departmentsTableAdapter.Fill(this.database1DataSet.Departments);
 
   this.branchesTableAdapter.Fill(this.database1DataSet.Branches);
 
   this.employeesTableAdapter.Fill(this.database1DataSet.Employees);




دعونا نقوم الآن بتجربة نجاح الربط فقط، وذلك بتشغيل المشروع ومشاهدة الأعمدة Branches وDepartments وهي تحتوي على اسماء كل منهم،
وذلك للإطمئنان على سير العمل بشكل صحيح،
ولكن حتى الآن لن يتم حفظ أي بيانات يتم إضافتها في الأداة DataGridView1،
ونقوم بعمل كود الحفظ (وهو سطر واحد فقط) في الخطوة التالية.

تحديث قاعدة البيانات:

إن اعتماء كل العمليات التي يتم إجراءها على الأداة DataGridView1 من إضافة وتعديل وحذف
تتم بهذا السطر فقط (مع ملاحظة إسم الجدول Employees والأمر Update)
VB
PHP كود :
Me.EmployeesTableAdapter.Update(Me.Database1DataSet.Employees
#C
PHP كود :
this.employeesTableAdapter.Update(this.database1DataSet.Employees); 

ولك الخيار بين أن تضعه في زر Button بإسم [تحديث] أو أن تضعه في حدث إغلاق النموذج Form1_FormClosing
وسأفترض أنك اخترت حدث إغلاق النموذج Form1_FormClosing

نأتي للخطوة الأخير وهي طريقة البحث:
نضيف أداة TextBox1 لكتابة الإسم المراد البحث عنه وButton1 لتنفيذ أمر البحث وعرض النتائج وButton2 لإعادة الوضع كما كان قبل البحث أو ما يسمى Reset.

الأسلوب الحديث في البحث بشكل عام هو استخدام تقنية Linq الخاصة من Microsoft.

هناك عدة رغبات في مسألة البحث عن نصوص وهي أربع حالات،
وكانت في السابق تستخدم % مع الأمر Like في جمل Sql كالتالي:
إذا كان الجزء المراد البحث عنه في بداية المعلومات كانت توضع العلامة % قبل مع الأمر LIKE.
إذا كانت الجزء المراد البحث عنه في وسط المعلومات كانت توضع العلامة % قبل وبعد مع الأمر LIKE.
إذا كانت الجزء المراد البحث عنه في آخر المعلومات كانت توضع العلامة % بعد مع الأمر LIKE.
إذا كانت المراد البحث عنه تطابق تام مع المعلومات كانت تستخدم العلامة = بدلا من الأمر LIKE وبدون العلامة %.

ولكن طريقة البحث مع تقنية Linq مختلفة وسهلة جداً وكأنك تبحث في مغير نصي كالتالي:
إذا كان الجزء المراد البحث عنه في بداية المعلومات نستخدم الأمر StartsWith.
إذا كانت الجزء المراد البحث عنه في وسط المعلومات نستخدم Contains.
إذا كانت الجزء المراد البحث عنه في آخر المعلومات نستخدم الأمر EndsWith.
إذا كانت المراد البحث عنه تطابق تام مع المعلومات نستخدم الأمر Equals.

ويمكن استخدام العلامة = في حالة المراد التطابق التام.

نأتي للمشروع، سنفترض أن الرغبة في أسلوب البحث عن المطلوب يكون البحث عن الأسماء التي تحتوي نصاً معيناً،
فسنكتب هذا الكود في الزر Button1
VB
PHP كود :
Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click

    DataGridView1
.DataSource Me.Database1DataSet.Employees.Where(Function(xx.Emp_Name.Contains(TextBox1.Text)).ToList

End Sub 
#C
PHP كود :
private void button1_Click(object senderEventArgs e) {

 
   dataGridView1.DataSource this.database1DataSet.Employees.Where(=> x.Emp_Name.Contains(textBox1.Text)).ToList();



وبالنسبة لإعادة إظهاء جميع الأسماء كما كانت قبل البحث نكتب هذا الكود في الزر Button2
VB
PHP كود :
Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button2.Click

    Me
.DataGridView1.DataSource Me.Database1DataSet.Employees

End Sub 
#C
PHP كود :
private void button2_Click(object senderEventArgs e) {

 
   this.dataGridView1.DataSource this.database1DataSet.Employees;



ويمكن إجراء بحث آخر دون الحاجة لإعادة إظهار جميع الأسماء الناتجة من بحث سابق.


ملاحظة:
إن التعديل في البيانات الظاهرة نتيجة البحث سوف تتم بشكل طبيعي دون التأثير على بقية بيانات قاعدة البيانات الغير ظاهرة.

وهذا كامل كود النموذج Form1
VB
PHP كود :
Public Class Form1


    Private Sub Form1_Load
(ByVal sender As System.ObjectByVal e As System.EventArgsHandles MyBase.Load

        Me
.DepartmentsTableAdapter.Fill(Me.Database1DataSet.Departments)
 
       Me.BranchesTableAdapter.Fill(Me.Database1DataSet.Branches)
 
       Me.EmployeesTableAdapter.Fill(Me.Database1DataSet.Employees)

 
   End Sub

    Private Sub Form1_FormClosing
(ByVal sender As ObjectByVal e As System.Windows.Forms.FormClosingEventArgsHandles Me.FormClosing

        Me
.EmployeesTableAdapter.Update(Me.Database1DataSet.Employees)

 
   End Sub


    Private Sub Button1_Click
(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button1.Click

        DataGridView1
.DataSource Me.Database1DataSet.Employees.Where(Function(xx.Emp_Name.Contains(TextBox1.Text)).ToList

    End Sub


    Private Sub Button2_Click
(ByVal sender As System.ObjectByVal e As System.EventArgsHandles Button2.Click

        Me
.DataGridView1.DataSource Me.Database1DataSet.Employees

    End Sub


End 
Class 
#C
PHP كود :
public partial class Form1 Form
{
 
   public Form1() {
 
       InitializeComponent();
 
   }


 
   private void Form1_Load(object senderEventArgs e) {

 
       this.departmentsTableAdapter.Fill(this.database1DataSet.Departments);
 
       this.branchesTableAdapter.Fill(this.database1DataSet.Branches);
 
       this.employeesTableAdapter.Fill(this.database1DataSet.Employees);

 
   }


 
   private void Form1_FormClosing(object senderFormClosingEventArgs e) {

 
       this.employeesTableAdapter.Update(this.database1DataSet.Employees);

 
   }


 
   private void button1_Click(object senderEventArgs e) {

 
       dataGridView1.DataSource this.database1DataSet.Employees.Where(=> x.Emp_Name.Contains(textBox1.Text)).ToList();

 
   }


 
   private void button2_Click(object senderEventArgs e) {

 
       this.dataGridView1.DataSource this.database1DataSet.Employees;

 
   }





إختفاء البيانات:
قد يلاحظ البعض أن أي تعديل في المشروع ينتج عنه اختفاء ما تم إضافته من بيانات في قاعدة البيانات قبل التعديل في المشروع،
ولتعطيل هذا الإختفاء نقوم بالتالي:
نحدد من ملفات المشروع ملف قاعدة البيانات Database1.accdb فتظهر لنا خصائص خاصة بالملف،
نذهب للخاصية Copy to Ouput Directory ونختار Copy if newer.

يمكن تطبيق هذا المشروع مع قاعدة بيانات SqlServer والنتيجة واحدة،
ما عدا فيما يخص ملف قاعدة البينات في ملفات المشروع،
لأنه لن يكون هناك ملف قاعدة بيانات ضمن ملفات المشروع.


في المرفقات مشروع تم التطبيق عليه كل الخطوات السابقة أثناء الكتابة للتأكد من عدم نسيان أي خطوة.


إن كانت الإدارة ترى أن هذه المشاركة فيها من الفائدة ما تستحق أن توضع في موضوع مستقل مع التعديل بما تراه مناسباً فلها ذلك مع شكري وتقديري.



الملفات المرفقة
.rar   Employees VB.rar (الحجم : 43.24 ك ب / التحميلات : 897)
.rar   Employees CS.rar (الحجم : 41.29 ك ب / التحميلات : 310)
الرد }}}}
#2
السلام عليكم

تم تثبيت الموضوع للاهمية

شكرا لك

يعطيك العافية
شـــايـفـــك

الرد }}}}
تم الشكر بواسطة: مهموم , khodor1985
#3
السلام عليكم ورحمة الله

أخي أبو ليث

أشكر لكم ثقتكم.
الرد }}}}
تم الشكر بواسطة: khodor1985
#4
شكرا أخي مهموم على هذا المجهود
أتمنى لك التوفيق
الرد }}}}
تم الشكر بواسطة: مهموم
#5
السلام عليكم ورحمة الله

أخي الأستاذ خضر

أشكر لكم تشريفكم لي.
الرد }}}}
تم الشكر بواسطة:
#6
وأنا عم تابع دروسك (بخدمتكم)
الرد }}}}
تم الشكر بواسطة: مهموم
#7
اخي الفاضل مهموم ( أزال الله عنك هم الدنيا والآخرة )

مجهود رائع
لي استفسار ... لا استطيع فتح ملف المشروع .... علما بأني استخدم Visual Studio 2008

فهل هذا هو السبب ؟
الرد }}}}
تم الشكر بواسطة:
#8
يوجد خطأ عند عمل ببلش للمشروع
الرد }}}}
تم الشكر بواسطة:
#9
مشكور اخي

يعطيك العافية
محاسب / أحمد عبد العليم
الرد }}}}
تم الشكر بواسطة:
#10
شكرا بارك الله فيك

فقط يوجد خطأ عند عمل ببلش للمشروع
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [مثال] مثال لنسخ وإستعادة قاعدة البيانات ( تحديث) نسخ تلقائي للقاعدة حسب اليوم والساعة جميل علي 28 2,334 06-12-16, 09:34 PM
آخر رد: مبتدئه برمجه
  [مثال] حفظ ملفات لـ PDF و الوورد والاكسيل داخل قاعدة البيانات( تحديث جديد) جميل علي 9 1,007 02-12-16, 03:40 PM
آخر رد: thecareep
  [مثال] مثال صغير .. لعرض داتا جريد لقاعدة بيانات وطباعتها boudyonline 3 928 15-11-16, 02:15 PM
آخر رد: marwen
  [VB.NET] مشروع مبسط للتعامل مع Sql Server With VB.net ممدوح الخطيب 3 419 31-10-16, 02:36 PM
آخر رد: aksoft
  [مشروع] مشروع موظفين asdsoft 2 416 30-10-16, 11:53 PM
آخر رد: asdsoft
  مشروع صغير لطباعة ملصقات الباركود وقرائتها بسهولة تامة عابر سبيل 10 8,969 13-10-16, 08:44 PM
آخر رد: Arabia
Brick [مشروع] مشروع تخرج برنامج عن وحدة التدريب والتوظيف مبرمج أوتار 51 69,086 12-10-16, 08:23 AM
آخر رد: citcnet
  [مشروع] مشروع شجرة الحسابات (دليل الحسابات) باستخدام VB.net أحمد النجار 11 3,260 09-10-16, 12:36 AM
آخر رد: محمود بكرى
  مثال لنسخ وإستعادة قاعدة البيانات mysql صبري زينوبي 2 221 29-09-16, 05:06 PM
آخر رد: صبري زينوبي
Smile مشروع تاجير سيارات adel2012 3 3,655 16-09-16, 06:21 PM
آخر رد: adel2012

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم