إستخدام Currency Manager فى ربط قاعدة بيانات أكسس فى فيجوال بيسيك 2005
بسم الله الرحمن الرحيم
Currency Manager
ما هو Currency Manager أو مدير التعاملات
هو مجموعة من أدوات التحكم تقوم بإدارة الاتصال بقاعدة البيانات وربطها بالتطبيق وعرض البيانات داخل الفورم ولكن لكى نفهم معنى Currency Manager يجب أن نعرف مسار عملية الإتصال بقاعدة البيانات
-عندما تريد الإتصال بقاعدة البيانات بغرض التحكم فى محتوياتها فمعنى ذلك أنة قد صدر أمر منك من خلال هذا الإتصال الصادر منك إلى قاعدة البيانات وهذا يسمى Data Connection
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة]وعلى ذلك ينبغى أن يتم الرد فى الوارد ويسمى الوارد من قاعدة البيانات إليك Data Adaptor ويتضمن معلومات حول الجداول والحقول التى قمت باختيارها
إذن لدينا الان Data Connection و Data Adaptor
ولكن كيف يمكن معرفة محتويات القاعدة من خلال الإتصال وبمعنى أكثر وضوحا كيف وبأى طريقة سيتم عرض المحتويات
يتم تفصيل وتقسيم محتويات قاعدة البيانات فى جزء يعرف باسم DataSet حيث أنة يتم تحليل قاعدة البيانات إلى مكوناتها الرئيسية Tables وViews وStored Procedures و Functions ....الخ
كما يتم عرض مكونات الجداول أيضا من حقول
بعد ذلك تذهب كافة المعلومات إلى أداة الربط Binding Source ومن خلال اسمها فمن الواضح أنها تقوم بتثبيت الاتصال الذى تم إنشاؤة وربط المعلومات بالفورم الذى ستقوم من خلالة بعرض البيانات
إذن هذا هو مسار الاتصال بقاعدة بيانات يمكننا أن نقوم بالحصول على البيانات عن طريق سلوك نفس المسار باستخدام كود دون أن نقوم بربط كل مربع نص بالحقل المطلوب هل يمكن ذلك
مثال
نفترض أن لدينا قاعدة بيانات A وأن بها الجدول B وعدد من الحقول ba,bb,bc,bd وأنة أثناء عمل اتصال بقاعدة البيانات قام معالج الإتصال بعمل Dataset وقام بتسميتها مثلا CDataSet نستطيع أن نقوم بتجميع هذة المعلومات لإنشاء كود لإحضار البيانات التى فى الحقل ba وإظهارها فى TextBox داخل الفورم
أى أننا نريد احضار النص Text الموجود فى قاعدة البيانات A فى الجدول B فى الحقل ba وربط البيانات DataBindings بمربع النص TextBox وبما أن DataSet قام بإحضار ما يلزمنا فى العمل فإننا سنذهب إلية ولن نذهب إلى قاعدة البيانات
يمكننا ترتيب السطر السابق لنحصل على جملة مفيدة كالتالى
TextBox.DataBindings.Add
وAdd لأننا نريد إضافتة
ثم نريد عرض Text الموجود فى DataSet المسماة CDataSet وبالتحديد فى الجدول B الحقل ba
("Text", CDataSet, "B.ba")
فتكون الصيغة الكاملة
TextBox.DataBindings.Add("Text", CDataSet, "B.ba")
ويجب أ ن نعتبرها قاعدة ويمكنكم دائما استخدام هذة القاعدة لإنشاء الكود
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] خصائص Currency Manager
والمقصود بهذة الخصائص هو العمليات التى يمكننا تنفيذها
1-Bindings
لربط مجموعة من العناصر ليتم التحكم بها من خلال Currency Manager
2-Count
لمعرفة عدد الصفوف المرتبطة مع Currency Manager
3-Current
لاستدعاء الصف المرتبط حاليا مع Currency Manager
4-List
لعرض قائمة تكون مرتبطة بقاعدة البيانات مثل DataViews
5-Position
للتعامل مع الصف الحالى اعتمادا على رقم هذا الصف داخل قاعدة البيانات
الوظائف التى يمكن تنفيذها من خلال Currency Manager
1- AddNew إضافة جديد
2- CancelCurrentEdit إلغاء التغييرات
3- EndCurrentEdit إنهاء وحفظ
4- Re fresh تحديث وإعادة تعبئة البيانات
5- RemoveAt إزالة
ولكى نفهم ما هو الفرق بين الخاصية والوظيفة فإننا سنقوم بعمل مثال بسيط جدا
مثال : الربط البسيط
الغرض من هذا المثال هو كيف تتعلم أن تقوم بابتكار الكود دون أن تظل تبحث عن كود لإنشاء برنامجك
الان نقوم بعمل ربط مباشر وبسيط للفورم بقاعدة البيانات دون أن نستخدم Binding Navigator
سنقوم بعمل تطبيق Currency Manager والمثال الذى سنتعامل معة اليوم يصلح لأن يستخدم للتعامل مع بيانات الأفراد والمعلومات الخاصة بهم مثل موظف أو تلميذ أو ملف لأحد المرضى فى مستشفى أو ما شابة ذلك
أولا يجب أن نقوم بإنشاء قاعدة بيانات جديدة وستحتوى قاعدة البيانات على جدول واحد بة 7 حقول يمكننا تسمية الجدول باسم مثل Information وتسمية قاعدة البيانات بأى اسم مثلا Informations
الحقول هى
1-اسم الحقل ID
Data Type=AutoNumber
Indexed= Yes (No Duplicates)
2- FirstName
3- LastName
4- HomePhone
5- Grade
6- PictureFile
وكلها نص Text
7- BirthDate
ثم قم بحفظ قاعدة البيانات بصورة Access2000
قم بفتح مشروع جديد مستخدما فيجوال بيسيك 2005 مكوناتة كالتالى
-عدد 3 TextBox
-Date Time Picker
- PictureBox
-عدد 6 Lable
-عدد 12 Buttons
أمامنا الان عملية ترتيب هذة المكونات لتكون شكل ملائم ومناسب
-فى خصائص PictureBox يمكنكم تغيير BackColor إلى أى لون كما يفضل تغيير خاصية Size إلى المقياس 3/2بمعنى أن يكون عرض مربع الصورة إلى طول مربع الصورة = 2 إلى 3 يعنى لو الطول 15 يكون العرض 10 ولو العرض 80 يكون الطول 120 وهكذا
-من المستسحن تغيير الخاصية SizeMode إلى Zoom لكى تستطيع مشاهدة جوانب الصورة كاملة شاملة الحواف
-من الممكن تغيير خاصية الإسم فى الأزرار الخاصة بالتالى فى Text وبدلا من أن نكتب السابق والتالى يمكننا كتابة
الأول كالتالى |< والأخير هكذا >| وكلا من < و > للسابق والتالى فتصبح أزرار التحكم بصورة أفضل
ولتغيير حجم Lable الذى سيكون أسفل صندوق الصورة قم بتغيير الخاصية Autosize إلى False
سنقوم بتسمية بعض المكونات وهذا الموضوع اختيارى لكننى قمت بإعادة تسمية المكونات التالية
Form1=frmInfo
Lable أسفل الصورة= lblPhotoFile
TextBox1= txtFirstName
TextBox2=txtLastName
TextBox3=txtHomePhone
TextBox4=txtGrade
btnFirstو btnPrevious و btnNext و btnLast و btnEdit و btnSave و btnCancel و btnAdd و btnDelete و btnPrint و btnExit و btnLoadPhoto
قم الان بحفظ المشروع ثم قم بنقل قاعدة البيانات إلى المجلد الذى بة المشروع
ندخل الان إلى مرحلة كتابة الكود
ندخل الان إلى مرحلة كتابة الكود
سنقوم باستيراد أسماء المجالات NameSpaces التى سنحتاجها وهى
كود:
Imports System.Data
Imports System.Data.OleDb
وطبعا سيتم كتابتها فى General التى تسمى بالتصريحات العامة وهى المنطقة التى تسبق أسطر إدخال الكود فى أعلى الصفحة
ثم الإعلان عن المتغيرات
كود:
Dim InfoConnection As OleDbConnection
Dim InfoCommand As OleDbCommand
Dim InfoAdapter As OleDbDataAdapter
Dim InfoTable As DataTable
Dim InfoManager As CurrencyManager
Dim InfoState As String
Dim InfoBookmark As Integer
يجب علينا الان أن نقوم بعمل الإتصال بقاعدة البيانات وكذلك إنشاء مكونات الإتصال DataSet وTable وDataAdapter وتعريف المتغيرات
لتعريف InfoConnection فإن الكود يكون التالى
كود:
InfoConnection = New OleDbConnection _
("Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " _
+ Application.StartupPath + "\..\..\Informations.mdb")
InfoConnection.Open()
ثم InfoCommand
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذه الصورة] ثم InfoAdapter
كود:
InfoAdapter = New OleDbDataAdapter()
InfoAdapter.SelectCommand = InfoCommand
InfoTable = New DataTable()
InfoAdapter.Fill(InfoTable)
ثم نقوم بوضع DataBinding
كود:
txtFirstName.DataBindings.Add("Text", InfoTable, "FirstName")
txtLastName.DataBindings.Add("Text", InfoTable, "LastName")
txtHomePhone.DataBindings.Add("Text", InfoTable, "HomePhone")
txtGrade.DataBindings.Add("Text", InfoTable, "Grade")
DateTimePicker1.DataBindings.Add("Text", InfoTable, "BirthDate")
lblPhotoFile.DataBindings.Add("Text", InfoTable, "PictureFile")
ثم InfoManager
كود:
InfoManager = DirectCast(Me.BindingContext(InfoTable), CurrencyManager)
ثم Call
كود:
Call SetState("View")
Call ShowPhoto()
ويتم كتابة كل ما سبق فى الفورم
ثم نقوم بإنشاء SetState وهى تحدد أوضاع الأزرار وصناديق النصوص من ناحية نشط أو غير نشط وللقراءة فقط
كود:
Private Sub SetState(ByVal AppState As String)
InfoState = AppState
Select Case AppState
Case "View"
btnFirst.Enabled = True
btnPrevious.Enabled = True
btnNext.Enabled = True
btnLast.Enabled = True
btnEdit.Enabled = True
btnSave.Enabled = False
btnCancel.Enabled = False
btnAdd.Enabled = True
btnDelete.Enabled = True
btnPrint.Enabled = True
btnExit.Enabled = True
txtFirstName.ReadOnly = True
txtLastName.ReadOnly = True
txtHomePhone.ReadOnly = True
DateTimePicker1.Enabled = False
btnLoadPhoto.Enabled = False
txtGrade.ReadOnly = True
Case "Edit", "Add"
btnFirst.Enabled = False
btnPrevious.Enabled = False
btnNext.Enabled = False
btnLast.Enabled = False
btnEdit.Enabled = False
btnSave.Enabled = True
btnCancel.Enabled = True
btnAdd.Enabled = False
btnDelete.Enabled = False
btnPrint.Enabled = False
btnExit.Enabled = False
txtFirstName.ReadOnly = False
txtLastName.ReadOnly = False
txtHomePhone.ReadOnly = False
DateTimePicker1.Enabled = True
btnLoadPhoto.Enabled = True
txtGrade.ReadOnly = False
End Select
txtFirstName.Focus()
End Sub
ثم ShowPhoto
كود:
Private Sub ShowPhoto()
If lblPhotoFile.Text <> "" Then
Try
PictureBox1.Image = Image.FromFile(lblPhotoFile.Text)
Catch ex As Exception
MessageBox.Show(ex.Message, "خطاء فى تحميل الصورة", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Else
PictureBox1.Image = Nothing
End If
End Sub
ثم نقوم بإنشاء حدث الإغلاق بنفس الطريقة التى اتبعناها فى موضوع (الإتصال بقاعدة البيانات وعرض محتوياتها)
كود:
Private Sub frmInfo_FormClosing(ByVal sender As Object, _
ByVal e As System.Windows.Forms. _
FormClosingEventArgs) Handles Me.FormClosing
If InfoState = "Edit" Or InfoState = "Add" Then
MessageBox.Show("يجب إنهاء التحرير أولا", "", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
e.Cancel = True
Else
Try
Dim InfoAdapterCommands As New OleDbCommandBuilder(InfoAdapter)
InfoAdapter.Update(InfoTable)
Catch ex As Exception
MessageBox.Show(ex.Message, "خطاء فى حفظ قاعدة البيانات", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
InfoConnection.Close()
InfoCommand.Dispose()
InfoAdapter.Dispose()
InfoTable.Dispose()
End If
End Sub
ثم نقوم بإنشاء إطار طباعة الكارت أو البطاقة التعريفية وسوف نقوم برسم هذا الإطار كالتالى وهذا مثال فقط للإطار ويمكنكم تطويرة حسب الرغبة
كود:
Private Sub PrintInfo(ByVal sender As Object _
, ByVal e As Drawing.Printing.PrintPageEventArgs)
Dim MyPen As Pen = New Pen(Color.Black, 3)
e.Graphics.DrawRectangle _
(MyPen, e.MarginBounds.X, e.MarginBounds.Y, 200, 350)
Dim MyFont As Font = New Font("Arial", 12, FontStyle.Bold)
Dim S As String = "أكتب هنا إسم المؤسسة أو الهيئة"
Dim SSize As SizeF = e.Graphics.MeasureString(S, MyFont)
e.Graphics.DrawString(S, MyFont, Brushes.Black _
, e.MarginBounds.X + CInt(0.5 * (200 - SSize.Width)) _
, e.MarginBounds.Y + 15)
e.Graphics.DrawImage(PictureBox1.Image, _
e.MarginBounds.X + 25, e.MarginBounds.Y + 50, 150, 200)
e.HasMorePages = False
MyFont = New Font("Arial", 14)
Dim Y As Integer = e.MarginBounds.Y + 260
S = txtFirstName.Text
SSize = e.Graphics.MeasureString(S, MyFont)
e.Graphics.DrawString(S, MyFont, Brushes.Black, _
e.MarginBounds.X + CInt(0.5 * (200 - SSize.Width)), Y)
Y += CInt(MyFont.GetHeight(e.Graphics))
S = txtLastName.Text
SSize = e.Graphics.MeasureString(S, MyFont)
e.Graphics.DrawString(S, MyFont, Brushes.Black, _
e.MarginBounds.X + CInt(0.5 * (200 - SSize.Width)), Y)
Y += CInt(MyFont.GetHeight(e.Graphics))
S = txtGrade.Text
SSize = e.Graphics.MeasureString(S, MyFont)
e.Graphics.DrawString(S, MyFont, Brushes.Black, _
e.MarginBounds.X + CInt(0.5 * (200 - SSize.Width)), Y)
End Sub
ثم نقوم بانشاء حدث الإنتقال والتركيز على مربع النص الأول عند الإضافة والتحرير
كود:
Private Sub txtFirstName_KeyPress(ByVal sender As _
System.Object, ByVal e As System.Windows.Forms. _
KeyPressEventArgs) Handles txtFirstName.KeyPress
If e.KeyChar = ControlChars.Cr Then
txtLastName.Focus()
End If
End Sub
وأخيرا الأكواد الخاصة بأزرار المشروع
فى زر الأول
كود:
InfoManager.Position = 0
Call ShowPhoto()
فى زر السابق
كود:
InfoManager.Position -= 1
Call ShowPhoto()
فى زر التالى
كود:
InfoManager.Position += 1
Call ShowPhoto()
فى زر الأخير
كود:
InfoManager.Position = InfoManager.Count - 1
Call ShowPhoto()
ثم إضافة
كود:
InfoBookmark = InfoManager.Position
Call SetState("Add")
InfoManager.AddNew()
PictureBox1.Image = Nothing
lblPhotoFile.Text = "
ثم إلغاء
كود:
InfoManager.CancelCurrentEdit()
If InfoState = "Add" Then
InfoManager.Position = InfoBookmark
End If
Call ShowPhoto()
Call SetState("View"
ثم حفظ
كود:
If txtLastName.Text.Trim = "" Then
MessageBox.Show("يجب إدخال إسم العائلة", "إدخال خاطىء", _
MessageBoxButtons.OK, MessageBoxIcon.Information)
txtLastName.Focus()
Exit Sub
End If
Dim SavedItem As String = txtLastName.Text
Dim SavedRow As Integer
InfoManager.EndCurrentEdit()
InfoTable.DefaultView.Sort = "LastName"
SavedRow = InfoTable.DefaultView.Find(SavedItem)
InfoManager.Position = SavedRow
Call ShowPhoto()
Call SetState("View")
ثم تحرير
كود:
Call SetState("Edit")
ثم تحميل صورة
كود:
Try
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
lblPhotoFile.Text = OpenFileDialog1.FileName
Call ShowPhoto()
End If
Catch ex As Exception
MessageBox.Show(ex.Message, "خطاءفى فتح الصورة", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
ثم طباعة
كود:
Dim InfoDocument As Drawing.Printing.PrintDocument
InfoDocument = New Drawing.Printing.PrintDocument()
InfoDocument.DocumentName = "Info"
AddHandler InfoDocument.PrintPage, AddressOf Me.PrintInfo
Dim SavedPosition As Integer = InfoManager.Position
PrintPreviewDialog1.Document = InfoDocument
PrintPreviewDialog1.ShowDialog()
InfoDocument.Dispose()
InfoManager.Position = SavedPosition
ثم حذف
كود:
If MessageBox.Show("هل أنت متأكد من أنك تريد حذف هذا السجل" _
, "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question, _
MessageBoxDefaultButton.Button2) = Windows.Forms.DialogResult.Yes Then
InfoManager.RemoveAt(InfoManager.Position)
Call ShowPhoto()
End If
Call SetState("View")
ثم إغلاق
كود:
Close()
وهذا رابط تحميل المشروع
[ندعوك للتسجيل في المنتدى أو التعريف بنفسك لمعاينة هذا الرابط]ولعمل بحث على نفس المشروع-قم بإدراج ز و مربع نص
قم باستخدام الصيغة التالية فى كود الزر
كود:
InfoTable.DefaultView.Sort = "اسم عمود البحث"
Dim FoundRow As Integer = InfoTable.DefaultView.Find(مربع النص)
If FoundRow <> -1 Then
InfoManager.Position = FoundRow
End If
فإذا أردنا البحث عن الإسم مثلا FirstName
كود:
InfoTable.DefaultView.Sort = "FirstName"
Dim FoundRow As Integer = InfoTable.DefaultView.Find(TextBox.Text)
If FoundRow <> -1 Then
InfoManager.Position = FoundRow
End If
وهكذا مع باقى الأعمدة
منقول من منتديات المشاغب