شاطر
اذهب الى الأسفل
عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معاينة صفحة البيانات الشخصي للعضو

الداتا قريد DataGridview (إضافة ، حذف ، تعديل ، طباعة)

في السبت سبتمبر 14, 2013 3:04 pm

1- كيف تضيف سجل في الداتا قريد (DataGridview) ؟..
2- كيف تحذف سجل من الداتاقريد (DataGridview) ؟..
3- كيف تقوم بتعديل سجل في الداتا قريد (DataGridview)؟..
4- كيف تقوم بالطباعة من الداتاقريد (DataGridview) ؟..
5- كيف تغير لون خلية في الداتاقريد بناء على شرط معين (DataGridview)؟..
6- كيف تجمع حقلين من الدتا قريد و تضيف النتيجة في حقل مستقل (DataGridview)؟..
7- كيف تضيف حقل في الداتا قريد من نوع combobox أو textbox ......؟..

[size=12]



أولا: ماهي DataGridview control؟

DataGridview control تستخدم لعرض بيانات مجدولة مع أنواع مختلفة من الـ datasource
كما أنها مزودة بالعديد من الـ properties و الـ method و الـ event لإمكانية تخصيص مظهر وسلوك الـداتاقريد.DataGridview زودت بالعديد من الخصائص الأساسية و المطورة المفقودة في الـ datagrid.

الفرق بين الdatagridview و الـ datagrid؟؟

اضغط لقراءة المقال

ثانيا: كيف تستخدم ال datagridview control ؟

نفرض أن لدينا جدولين في قواعد بيانات أكسس(DGview) باسم tb1 , tb2
الجدول الأول يحتوي على أربع حقول( الرقم وهو المفتاح، والاسم، العنوان، رقم المدينة وهو المفتاح الأجنبي)
الجدول الثاني يحتوي على حقلين فقط ( رقم وهو المفتاح الأساسي ، و اسم المدينة)
ثم يتم الربط بينهما كما هو موضح في الصورة



ننشئ مديول 1 خاصة بالاتصال بقاعدة البيانات :

الكود:

Module Module1

   Private ConStr As String
   Private Conn As OleDbConnection
   'انشاء اتصال جديد
   Public Sub CreateConn()
      ConStr = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" & _
            Application.StartupPath & "\DGview.mdb"
      Conn = New OleDbConnection(ConStr)
   End Sub
   'ارجاعة قيمة المتغير  الخاص بالاتصال
   Public Function getConn() As OleDbConnection
      Return Conn
   End Function
   'فتح الاتصال
   Public Sub OpenConn()
      Conn.Open()
   End Sub
   'اغلاق الاتصال
   Public Sub CloseConn()
      Conn.Close()
      Conn.Dispose()
      Conn = Nothing
   End Sub
End Module
لنبدأ الآن شرح العمليات الأساسية:


1- الإضافة:
" />


زر الإضافة خاص بتفعيل الحقول و زيادة الرقم التسلسلي بواحد واظهاره في مربع نص غير مفعل ، عند اكمال الحقول نختار زر حفظ لحفظ البيانات ،

الكود الخاص بزر الحفظ
الكود:

Try
         Dim SavInto As New OleDb.OleDbCommand
         CreateConn()
         SavInto.Connection = getConn()
         SavInto.CommandType = CommandType.Text
         SavInto.CommandText = "INSERT INTO tb1(ID,name,Address,countryID)" & _
          "values ('" & Me.txt_ID.Text & "','" & Me.txt_name.Text & "','" & Me.txt_address.Text & "','" & Me.cmb_country.SelectedValue & "') "
         OpenConn()
         If SavInto.ExecuteNonQuery() Then
            'إذا تمت عملية الإضافة بنجاح يتم اضافة الحقول إلى الداتا قريد مباشرة بدل استراجاعها من الداتابيس
            t1.Text = "تمت إضافة السجل الجديد بنجاح"
            DGview.Rows.Add()
            DGview.Item(0, DGview.Rows.Count - 1).Value = Me.txt_ID.Text
            DGview.Item(1, DGview.Rows.Count - 1).Value = Me.txt_name.Text
            DGview.Item(2, DGview.Rows.Count - 1).Value = Me.txt_address.Text
            DGview.Item(3, DGview.Rows.Count - 1).Value = Me.cmb_country.Text

            Me.btn_save.Enabled = False
            Me.btn_add.Enabled = True
            Me.grp1.Enabled = False
         Else
            MsgBox("فشلت عملية الإضافة", MsgBoxStyle.MsgBoxRight, "رسالة خطأ")
         End If
         CloseConn()
      Catch ex As Exception
         MsgBox("صادف مشكله أثناء القيام بعمليه الإضافه , الرجاء المحاولة لاحقا", MsgBoxStyle.OkOnly, "تنبيه")
      End Try


ر



2- الحذف:

" />


لحذف سجل معين من الداتا قريد يتم اختياره السجل المحدد بعد ذلك انقر على زر حذف و هذا الكود الخاص بزر الحذف:

الكود:

If MsgBox("هل أنت متأكد من عملية الحذف   ? ", MsgBoxStyle.OkCancel, "تأكيد حذف") = MsgBoxResult.Cancel Then
         Exit Sub
      End If
      Try
         CreateConn()
         Dim SavInto As New OleDb.OleDbCommand
         SavInto.Connection = getConn()
         SavInto.CommandType = CommandType.Text
         '-----------------
         'حذف قيمة السجل الذي يتم تحديده
         'DGview.Item(0, DGview.CurrentCellAddress.Y).Value
         SavInto.CommandText = "DELETE FROM tb1  WHERE ID =" & CType(DGview.Item(0, DGview.CurrentCellAddress.Y).Value, Integer) & ""
         '---------------
         OpenConn()
         If SavInto.ExecuteNonQuery() Then
            t1.Text = "تمت علمية حذف البيانات بنجاح"
            'إذا تم حذف السجل بنجاخ من قاعدة البيانات
            'يتم ايضا حذفه من الداتاقريد مباشرة
            If Not DGview.CurrentRow.IsNewRow Then
               DGview.Rows.Remove(DGview.CurrentRow)
            End If
         Else
            MsgBox("فشلت عملية الحذف  حاول مرة أخرى ", MsgBoxStyle.MsgBoxRight, "فشل العملية")
         End If
         CloseConn()

      Catch ex As Exception
         MsgBox("لا يوجد أي سجلات للحذف  ", MsgBoxStyle.MsgBoxRight, "فشل العملية")

      End Try




3- التعديل:

" />



قم بتعيين السجل المراد تعديله ثم اختر تعديل تظهر لك نافذة صغير(panel) تعرض لك بيانات السجل المراد تعديله

الكود الخاص بزر تعديل:

الكود:

عرض النافذة الصغيرة الخاصة بالتعديل’
      '(panel)
      Me.panel.Visible = True
      Me.btn_search.Enabled = False
      Me.Button2.Enabled = False
      'تعيين قيمة الحقول بنفس قيم السجل الذي تم تحديده
      Me.IDTextBox.Text = DGview.Item(0, DGview.CurrentCellAddress.Y).Value
      Me.txt_name1.Text = DGview.Item(1, DGview.CurrentCellAddress.Y).Value
      Me.txt_address1.Text = DGview.Item(2, DGview.CurrentCellAddress.Y).Value
      PlaceTextBox.Text = DGview.Item(3, DGview.CurrentCellAddress.Y).Value



الكود الخاص بزر حفظ:

الكود:

If MsgBox("تأكيد عملية التعديل ؟ ", MsgBoxStyle.OkCancel, "تعديل المبادرات") = MsgBoxResult.Cancel Then
         Exit Sub
      End If
      Try
         Dim SavInto As New OleDb.OleDbCommand
         CreateConn()
         SavInto.Connection = getConn()
         SavInto.CommandType = CommandType.Text
         SavInto.CommandText = "UPDATE tb1 SET   name = '" & Trim(Me.txt_name1.Text) & "' , Address= '" & Trim(Me.txt_address1.Text) & "', countryID = '" & Trim(Me.PlaceTextBox.SelectedValue.ToString) & "' WHERE  ID = " & CType(IDTextBox.Text, Integer) & ""
         OpenConn()
         If SavInto.ExecuteNonQuery() Then

إذا تم تعديل قاعدة البيانات بنجاح يتم تعديل الداتاقريد مباشرة’
            MsgBox("تم تعديـــل " & Me.txt_name2.Text & " بنجاح", MsgBoxStyle.MsgBoxRight, "نجاح العملية")
            DGview.Item(1, DGview.CurrentCellAddress.Y).Value() = txt_name1.Text
            DGview.Item(2, DGview.CurrentCellAddress.Y).Value() = txt_address1.Text
            DGview.Item(3, DGview.CurrentCellAddress.Y).Value() = PlaceTextBox.Text
            'اخفاء نافذة التعديل
            Me.panel.Visible = False

            Me.btn_search.Enabled = True
            Me.Button2.Enabled = True
            t1.Text = "تم التعديل بنجاح"
         Else
            MsgBox("لم يتم تعديل " & Me.txt_name2.Text, MsgBoxStyle.MsgBoxRight, "رسالة خطأ")
         End If
         CloseConn()
      Catch ex As Exception
         MsgBox(ex.Message)
      End Try


4- البحث:

" />


يتم البحث بناء على الحقل الذي يتم تفعيلة (بوضع إشارة صح على الحقل) يمكن البحث بحقل أو أكثر في نفس الوقت :

المتغيران : Where_SQL , SQLTemp

متغيرات من نوع string يتم تعيرفها في قسم التصريحات العامة

الكود:

SQLTemp = ""
      Where_SQL = ""
هنا يتم بناء جملة الاستعلام’
فقط الجزء الخاص بالجملة  where’

      ‘كل مربع نص يحتوي على قيمه يتم اضافته الى جملة الاستعلام’
      If Trim(Me.txt_num.Text) <> "" Then
         Where_SQL = "  tb1.ID = " & CType(txt_num.Text, Integer) & ""
         SQLTemp &= Temp & Where_SQL
      End If
      '-----------------
      If Trim(Me.txt_name2.Text) <> "" Then
         Where_SQL = " name like '%" & txt_name2.Text & "%'"
         SQLTemp &= Temp & Where_SQL
      End If
      '----------
      If Trim(Me.txt_address2.Text) <> "" Then
         Where_SQL = " address like '%" & Me.txt_address2.Text & "%' "
         SQLTemp &= Temp & Where_SQL
      End If
      '------------
      If Me.txt_region.Text <> "" And Me.b_region.Checked = True Then
         Where_SQL = " tb2.ID =  " & CType(Me.txt_region.SelectedValue.ToString, Integer) & "   "
         SQLTemp &= Temp & Where_SQL
      End If
‘يتم استدعاء الدالة
FillDG(SQLTemp)’
‘لتعبئة الداتاقريد بنتائج البحث
      FillDG(SQLTemp)




ويتم تعريف الدالة FillDG كما يلي:

Sub FillDG(ByVal SQL)

CreateConn()

OpenConn()
cmd.Connection = getConn()

DGview.Columns.Clear()
cmd.CommandType = CommandType.Text
'جملة الاستعلام الخاصة بالبحث
cmd.CommandText = "select tb1.ID ,name,Address,countryname from tb1, tb2 where tb1.countryID=tb2.ID" & SQL
dr = cmd.ExecuteReader
'تحديد عدد الأعمدة في الداتا قريد
DGview.ColumnCount = 4
'تعيين اسماء الأعمدة في الداتاقريد
DGview.Columns(0).HeaderText = "الرقم"
DGview.Columns(1).HeaderText = "الاسم"
DGview.Columns(2).HeaderText = "العنوان"
DGview.Columns(3).HeaderText = "المدينة"

'loop
'يتم تعببئة الداتا قريد بنتائج البحث
Dim n As Integer
n = -1
Do While dr.Read

n += 1
DGview.RowCount += 1
DGview.Item(0, n).Value = dr.Item("ID") '
DGview.Item(1, n).Value = dr.Item("name")
DGview.Item(2, n).Value = dr.Item("Address")
DGview.Item(3, n).Value = dr.Item("countryname")
Loop
dr.Close()
CloseConn()


End Sub

- الطباعة:

بالنسبة للطباعة نتائج البحث من الداتا قريد مباشرة .ليس هناك طريقة مباشرة حسب علمي وقد بحثت في ذلك كثيرا في المواقع العربية و الأحنبية ،و لم اجد طريقة مباشرة لارسال

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

ادت المطلوب و الطريقة كما يلي: <<<إذا كان هناك طريقة أخرى أفضل من هذه فلا تتردد في وضعها لنستفيد منها جميعاً


ننشيء جدول باسم tbl_temp يحتوي على نفس الحقول الموجودة في الجدول tb1 يتم تخزين نتائج البحث من الداتاقريد فيه أولا بعذ ذلك يتم ربط

الكريستال ريبورت بالجدول المؤقت مباشرة .
" />


عند اختيار زر بحث يتم تعبئة نتائج البحث في datasource ليتم الاستفادة من الـ datesource لتعبئة الجدول المؤقت

كود الزر الخاص بالطباعة:

الكود:
Try
         ' داله لحذف جميع البيانات السابقة الموجودة في الجدول المؤقت
         delete_temp()
         'دالة لادخال جميع السجلات الموجودة في الداتا قريد (نتيجة البحث) للجدول المؤقت
         insert_temp()

         'لعرض الفورم الخاص بالتقرير
         frm_rep.Show()
      Catch ex As Exception
         MsgBox(ex.Message)
      End Try



تعريف الدالة delete_temp()

الكود:
'حذف جميع السجلات الموجودة في الجدول المؤقت
   Private Sub delete_temp()
      Try
         Dim SavInto As New OleDb.OleDbCommand
         CreateConn()
         SavInto.Connection = getConn()
         SavInto.CommandType = CommandType.Text

         SavInto.CommandText = "delete * from tbl_temp "


         OpenConn()
         SavInto.ExecuteNonQuery()
         CloseConn()
         SavInto.Dispose()
         SavInto = Nothing
      Catch ex As Exception
         MsgBox(ex.Message)
      End Try

   End Sub


تعريف الدالة Insert_temp()

الكود:
Private Sub insert_temp()
      'يتم ادخال جميع السجلات الموجودة في
      'datasource (ds)
      'إلى الجدول المؤقت

      Dim i As Integer
      Try
         Dim SavInto As New OleDb.OleDbCommand
         CreateConn()

         SavInto.Connection = getConn()
         SavInto.CommandType = CommandType.Text
         OpenConn()
         'حلقة تبدأ من صفر و حتى آخر سجل الموجودةالـ
         'datesource(ds)
         For i = 0 To ds.Tables("table").Rows.Count - 1
            SavInto.CommandText = "INSERT INTO tbl_temp(ID,name,Address,countryID)" & _
            "values ('" & ds.Tables("table").Rows(i).Item(0) & "','" & ds.Tables("table").Rows(i).Item(1).ToString & "','" & ds.Tables("table").Rows(i).Item(2).ToString & "','" & ds.Tables("table").Rows(i).Item(3).ToString & "' )"
            SavInto.ExecuteNonQuery()
         Next
         SavInto.Dispose()
         SavInto = Nothing
         CloseConn()
      Catch ex As Exception
         MsgBox(ex.Message)
      End Try

   End Sub


لم يتبقى فقط إلا ربط الكريستال ريبورت بجدول الـ tbl_temp لطباعة نتائج البحث

" />

شرح بعض العمليات الإضافية:



لتغيير لون خلية بناء على شرط معين:


عند النقر المزدوج على الداتاقريد نختار الحدث CellFormatting من القائمة
" />

و نكتب الكود التالي:
الكود:
' تحديد العمود الذى يتم تغير خلاياه بشرط معين
      If e.ColumnIndex = DGview.Columns(2).Index Then

         ' متغير يحمل قيمة الخلية
         Dim Obj As Object = DGview.Rows(e.RowIndex).Cells(2).Value

         'اذا كانت قيمة الخلية =  XXX
         'يتم تغير الخلية باللون الأحمر

         If Obj = "ضع الجملة التي تريدها هنا" Then
            e.CellStyle.BackColor = Color.Red
            e.CellStyle.SelectionBackColor = Color.Red
            e.CellStyle.SelectionForeColor = Color.Black
         End If

      End If


لتغيير العنوان الخاص باسم الحقل:

الكود:
DGview.Columns(0).HeaderText = "الرقم"
DGview.Columns(1).HeaderText = "الاسم"
DGview.Columns(2).HeaderText = "العنوان"
DGview.Columns(3).HeaderText = "المدينة"



لإضافة عمود من نوع (ComboBox) للداتاقريد:

" />

الكود:
Dim cmb1 As New DataGridViewComboBoxColumn
      With cmb1
         .HeaderText = "اسم العمود "
         .Items.Add("الخيار الأول")
         .Items.Add("الخيار الثاني")
         .AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader
      End With
      DGview.Columns.Add(cmb1)
DGview يمثل اسم الداتاقريد

نفس الفكرة لاضافة عمود من نوع checkbox استبدل الكائن ( DataGridViewComboBoxColumn) بـ DataGridViewCheckBoxColumn



لإضافة عمود من نوع (TextBox)للداتاقريد:



الكود:
DGview.Columns.Add("column name", " عنوان العمود")


لتعبئة هذا الحقل بقيمة معينة نستخدم رقم العمود :

مثال : في الصورة السابقة يكون رقم العمود 4 لأننا العد بيدأ من الصفر ( الرقم ، الأسم ، العنوان ، المدينة ، اسم العمود):

الكود:
DGview.Item(رقم العمود, رقم الخلية).Value =”. . .”

لجمع قيمة حقلين و إضافة النتيجة في العمود الثالث من الداتا قريد:

الكود:
DGview.Item(3, DGview.Rows.Count - 1).Value = CType(Me.txt1.Text, Integer) + CType(Me.txt2.Text, Integer)

الرقم 3 يمثل رقم العمود الذي سوف يتم اضافة المجموع فيه و يتم تحويل txt1.Text و الحقل txt2.Text الى رقم (integer).
تم الانتهاء بحمد الله....



الغرض من هذا الشرح هو كيفية التعامل مع الداتا قريد و لم يتم الخوض في شرح كيفية الاتصال بقاعدة البيانات لأنها شرحت من قبل في هذا المنتدى كما تم ارفاق المثال كاملاً للرجوع

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


[/size]

_________________
[img] [/img]
الرجوع الى أعلى الصفحة
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى