- tarik
- عدد المساهمات : 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
" />
يتم البحث بناء على الحقل الذي يتم تفعيلة (بوضع إشارة صح على الحقل) يمكن البحث بحقل أو أكثر في نفس الوقت :
المتغيران : 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 يمثل اسم الداتاقريد
لإضافة عمود من نوع (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)
تم الانتهاء بحمد الله....
الغرض من هذا الشرح هو كيفية التعامل مع الداتا قريد و لم يتم الخوض في شرح كيفية الاتصال بقاعدة البيانات لأنها شرحت من قبل في هذا المنتدى كما تم ارفاق المثال كاملاً للرجوع
إلية عند الحاجة . و أحب أن أعتذر عن أي خطأ او قصور في الشرح و من لديه ملاحظات أو اضافات يضعها ليستفيد الجميع منها ..
[/size]
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى