أنشئ مشروعا جديدا من نوع WPF Application وسمه WpfDataEntery وأضف للمشروع قاعدة البيانات المرفقة وأنشئ DataSet بالاعتماد على الجدول Customer وذلك بالطريقة الاعتيادية عند إضافة مصدر بيانات جديد وبذلك نكون قد أضفنا CustomerDatSet للمشروع
افتح قائمة View ثم other Window ثم اختر الأمر document outline
عدل كود xaml الخاص بالنافذة ليصبح كما يلي كي نقوم بتقسيم الشبكة إلى أربعة أقسام
<Window x:Class="Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="294" Width="525"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="46*" /> <RowDefinition Height="216*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="138*" /> <ColumnDefinition Width="140*" /> </Grid.ColumnDefinitions> </Grid> </Window>
ثم أضف أربعة أزرار للنافذة لاحظ انه بعد تفعيل document outline أنه أصبح بإمكانك سحب وإفلات التحكمات على النافذة تماما كما نفعل في تطبيقات Windows Forms ثم غير خصائص الأربعة أزرار ليتم ضيط خاصية Contnt لها إلى Delete و Add و Revert و Save و خاصية Name إلى btnDelete و btnAdd و btnRevert و btnSave
أضف أربة ازرار أخرى من أجل الانتقال السابق والتالي والأول والأخير واجعل خاصية name كالتالي btnFirst و btnPrevious و btnNext و btnLast
أضف stackpanel عدد 2 إلى القسمين السفليين من الـ Grid وغير حجمهما ليملأ كل واحد كامل مساحة قسم الشبكة الموجود فيه ثم اضف أربعة تحكمات label لـ StackPanel اليساري و أربعة تحكمات TextBox لليميني ثم اضبط خاصية height لصناديق النصوص إلى 28 لمساواة ارتفاعها مع تحكمات Label ثم اضبط خاصية Width لجميع تحكمات Labelو TextBox إلى Auto
اضبط قيمة Content لـ Label العلوي إلى CustomerId واجعل خاصية name لـ TextBox العلوي txtCustomerID كما اضبط خاصية IsReadOnly له إلى True
اضبط خاصية Content لبقية تحكمات Lable إلى Last Name و First Name و City و خاصية name لبقية تحكمات TextBox إلى txtLastName و txtFirstName و txtCity
من أجل ربط صناديق النصوص بالبيانات افتح قائمة Data ثم اختر Show Data Sources انتقل إلى كود xaml و أضف النص التالي الذي يحدد كيفية ربط الخاصية text لصندوق النصوص txtCustomerID بالحقل CustomerID كما يلي Text="{Binding Path=CustomerID, Mode=OneWay} وقمنا بتحديد OneWay لأنه للقراءة فقط
أضف الخاصية text لـ txtLastName كما يلي Text="{Binding Path=LastName} وقد أزلنا القيمة oneWay لأنه للقراءة والكتابة كرر نفس العملية بالنسبة لصندوقي النصوص الباقيين لربطها مع الحقول المناسبة وبذلك يصبح كود xaml لصناديق النصوص لديك مشابها للتالي
<TextBox Height="28" Name="txtCustomerID" Width="Auto" IsReadOnly="True"
Text="{Binding Path=CustomerID, Mode=OneWay}" />
<TextBox Height="28" Name="txtLastName" Width="Auto"
Text="{Binding Path=LastName}"/>
<TextBox Height="28" Name="txtFirstName" Width="Auto"
Text="{Binding Path=FirstName}"/>
<TextBox Height="28" Name="txtCity" Width="Auto"
Text="{Binding Path=City}"/>انقر على نافذة التطبيق بزر الفأرة اليميني ثم اختر View Code واضف المتغيرات التالية في القسم العام للفئة في ملف الكود
Private CustomerData As New CustomerDataSet Private taCust As New CustomerDataSetTableAdapters.CustomerTableAdapter Private taManager As New CustomerDataSetTableAdapters.TableAdapterManager
أضف الكود التالي لحدث Loaded للنافذة
Me.taCust.Fill(Me.CustomerData.Customer) Me.DataContext = Me.CustomerData.Customer
حيث قمنا بملئ taCust الذي هو عبارة عن محول البيانات بالبيانات باستخدام الطريقة Fill ثم ضبطنا قيمة الخاصية DataContext للنافذة إلى الجدول Customer فإن شغلت البرنامج هنا ستلاحظ ظهور البيانات على النافذة
عرف المتغير التالي على مستوى الفئة حيث يعتبر CollectionView في تطبيقات WPF بديلا عن BindingSource في تطبيقات النوافذ
Private View As CollectionView
ومن أجل ربطه مع بياناتنا نستخدم الكود التالي في الحدث Loaded للنافذة بعد الكود الذي أدخلناه فيها سابقا
Me.View= CollectionViewSource.GetDefaultView(Me.CustomerData.Customer)
أجعل حدث النقر على أزرار التنقل كما في الكود التالي من أجل تنقيذ عمليات التنقل بين السجلات
Private Sub btnFirst_Click(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles btnFirst.Click Me.View.MoveCurrentToFirst() End Sub Private Sub btnPrevious_Click(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles btnPrevious.Click If Me.View.CurrentPosition > 0 Then Me.View.MoveCurrentToPrevious() End If End Sub Private Sub btnNext_Click(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles btnNext.Click If Me.View.CurrentPosition < Me.View.Count - 1 Then Me.View.MoveCurrentToNext() End If End Sub Private Sub btnLast_Click(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles btnLast.Click Me.View.MoveCurrentToLast() End Sub
أدخل الكود التالي من أجل زر الحذف
Private Sub btnDelete_Click(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles btnDelete.Click If Me.View.CurrentPosition > -1 Then Dim row = CType(Me.View.CurrentItem, System.Data.DataRowView).Row row.Delete() End If End Sub
حيث تأكدنا أولا أننا لسنا خارج النطاق قبل عملية الحذف ثم استخدمنا الدالة Ctype للحصول على السطر الحالي ثم قمنا بعملية الحذف
من أجل زر الإضافة أدخل الكود التالي
Private Sub btnAdd_Click(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles btnAdd.Click Dim row = Me.CustomerData.Customer.NewCustomerRow row.LastName = "[New]" Me.CustomerData.Customer.AddCustomerRow(row) Me.View.MoveCurrentToLast() End Sub
حيث أنشانا سطرا جديدا وحددنا قيمة افتراضية لحقل الاسم الأخير بما أنه لا يمكن أن يكون فارغا حسب قاعدة البيانات ثم قمنا بإضافته للجدول Customer والسطر الأخير من اجل إظهار السجل الجديد
ومن أجل زر Revert أضف الكود التالي
Private Sub btnRevert_Click(ByVal sender As System.Object, _ ByVal e As System.Windows.RoutedEventArgs) Handles btnRevert.Click If Me.CustomerData.HasChanges Then Dim msg = "Are you sure that You want to loose all your changes?" If MessageBox.Show(msg, Me.Title, MessageBoxButton.YesNo) = _ MessageBoxResult.Yes Then Me.CustomerData.RejectChanges() End If End If End Sub
حيث أظهرنا رسالة للمستخدم ليؤكد أنه يرغب فعلا بإلغاء جميع التعديلات التي قام بها وإن وافق نستخدم الطريقة RejectChanges لإلغاء تلك التغييرات
أضف السطر التالي لحدث Loaded للنموذج لربط TableAdaptermanager مع الجدول المناسب
Me.taManager.CustomerTableAdapter = taCust
وسوف يكون كود زر الحفظ كما يلي
Private Sub btnSave_Click(ByVal sender As System.Object, _
ByVal e As System.Windows.RoutedEventArgs) Handles btnSave.Click
Try
If Me.CustomerData.HasChanges Then
If Me.taManager.UpdateAll(Me.CustomerData) > 0 Then
MsgBox("Saved")
End If
End If
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Subحيث استخدمنا حلقة Try لالتقاط أي خطأ يصدر عن قاعدة البيانات وتأكدنا من أنه توجد تعديلات كي نقوم بحفظها وذلك باستخدام الدالة HasChanges ثم استخدمنا الطريقة UpdateAll من أجل عملية الحفظ الفعلية
شغل البرنامج واختبره