الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استخدام قواعد البيانات مع تطبيقات Wpf ر ( 1 )

بدأه محمد سامر أبو سلو في 20 يونيو 2009 · 0 رد · 488 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1

أنشئ مشروعا جديدا من نوع 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 من أجل عملية الحفظ الفعلية

شغل البرنامج واختبره

مثال كامل عن الموضوع

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 20 يونيو 2009 في 01:29

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

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…