الوضع ظاهري في عنصر تحكم DataRepeater (Visual Studio)
عمدما تريد عرض كميات كبيرة من البيانات الجدولية في عنصر التحكم DataRepeater ، يمكنك تحسين الأداء بواسطة تعيين الخاصية VirtualMode إلى True و إدارة تفاعل عنصر التحكم مع مصدر البيانات الخاص به بوضوح . و عنصر التحكم DataRepeater يوفر العديد من الأحداث التي يمكنك معالجتها للتفاعل مع مصدر البيانات و عرض البيانات حسب الحاجة في وقت التشغيل .
كيف يعمل الوضع ظاهري
السيناريو الأكثر شيوعاً لعنصر التحكم DataRepeater ، تعتبر وسائل لربط عناصر التحكم التابعة لـ ItemTemplate بمصدر البيانات في وقت التصميم و السماح لـ BindingSource بتمرير البيانات ذهاباً و إياباً حسب الحاجة. و عند استخدام الوضع الظاهري فإن عناصر التحكم لا ترتبط بمصدر البيانات ، و يتم تمرير البيانات ذهاباً و إياباً إلى مصدر البيانات الأساسي في وقت التشغيل.
و عند تعيين خاصية VirtualMode إلى True، فإنك تنشئ واجهة مستخدم عن طريق إضافة عناصر التحكم الموجودة في مربع الأدوات بدلاً من إضافة عناصر تحكم المحدودة من نافذةمصادر البيانات .
و يتم رفع الأحداث على أساس تتابع عناصر التحكم ، ثم يجب عليك إضافة التعليمات البرمجية لمعالجة عرض البيانات . و عند تمرير DataRepeaterItem جديد في العرض ، يتم رفع حدث ItemValueNeeded مرة واحدة لكل عنصر تحكم كما يجب توفير القيم لكل عنصر تحكم في معالج الأحداث ItemValueNeeded .
و في حالة تم تغيير البيانات في أحد عناصر التحكم بواسطة المستخدم ، يتم رفع حدث ItemValuePushed و يجب التحقق من صحة البيانات ثم حفظها إلى مصدر البيانات.
إذا أضاف المستخدم عنصر جديد ، يتم رفع حدث NewItemNeeded . استخدم معالج الحدث هذا لإنشاء سجل جديد في مصدر البيانات. و لمنع التغييرات غير المقصودة ، يجب عليك أيضاً مراقبة حدث KeyDown لكل عنصر تحكم و استدعاء CancelEdit إذا ضغط المستخدم على مفتاح ESC .
و إذا تغير مصدر البيانات ، يمكنك تحديث عنصر التحكم DataRepeater عن طريق استدعاء أساليب BeginResetTemplateItem() و EndResetTemplateItem() . يجب استدعاء كلا الأسلوبين بالترتيب.
و أخيراً ، يجب تطبيق معالجات الحدث لحدث ItemsRemoved , الذي يحدث عند حذف عنصر و اختيارياً للأحداث UserDeletingItems و UserDeletedItems, و التي تحدث عندما يقوم المستخدم بحذف عنصر عن طريق الضغط على مفتاح DELETE .
تطبيق الوضع الظاهري
فيما يلي الخطوات اللازمة لتطبيق الوضع الظاهري.
لتطبيق الوضع الظاهري
اسحب عنصر التحكم DataRepeater من علامة تبويب Visual Basic PowerPacks في مربع الأدوات إلى النموذج أو عنصر تحكم الحاوية. قم بتعيين VirtualModeإلى خاصية True.
اسحب عناصر التحكم من مربع الأدوات إلى منطقة قالب العنصر (المنطقة العلوية) من عنصر التحكم DataRepeater . ستحتاج لعنصر تحكم واحد لكل حقل في مصدر البيانات الذي تريد عرضه .
قم بتطبيق المعالج لحدث ItemValueNeeded لتوفير قيم لكل عنصر تحكم. يتم رفع هذا الحدث عند تمرير DataRepeaterItem جديد في العرض. سوف تشبه التعليمات البرمجية المثال التالي ، و هو لمصدر البيانات باسم Employees.
Private Sub DataRepeater1_ItemValueNeeded( ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs ) Handles DataRepeater1.ItemValueNeeded If e.ItemIndex < Employees.Count Then Select Case e.Control.Name Case "txtFirstName" e.Value = Employees.Item(e.ItemIndex + 1).firstName Case "txtLastName" e.Value = Employees.Item(e.ItemIndex + 1).lastName End Select End If End Sub
private void dataRepeater1_ItemValueNeeded(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs e) { if (e.ItemIndex < Employees.Count) { switch (e.Control.Name) { case "txtFirstName": e.Value = Employees[e.ItemIndex + 1].firstName; break; case "txtLastName": e.Value = Employees[e.ItemIndex + 1].lastName; break; } } }
تطبيق المعالج لحدث ItemValuePushed لتخزين البيانات . يتم رفع هذا الحدث عندما يقوم المستخدم بتنفيذ التغييرات لعنصر التحكم التابع لـ DataRepeaterItem. سوف تشبه التعليمات البرمجية المثال التالي ، و هو لمصدر البيانات باسم Employees.
Private Sub DataRepeater1_ItemValuePushed( ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs ) Handles DataRepeater1.ItemValuePushed Dim emp As Employee = Employees.Item(e.ItemIndex) Select Case e.Control.Name Case "txtFirstName" emp.firstName = e.Control.Text Case "txtLastName" emp.lastName = e.Control.Text Case Else MsgBox("Error during ItemValuePushed unexpected control: " & e.Control.Name) End Select End Sub
private void dataRepeater1_ItemValuePushed(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs e) { Employee emp = Employees[e.ItemIndex]; switch (e.Control.Name) { case "txtFirstName": emp.firstName = e.Control.Text; break; case "txtLastName": emp.lastName = e.Control.Text; break; default: MessageBox.Show("Error during ItemValuePushed unexpected control: " + e.Control.Name); break; } }
تطبيق المعالج لكل عنصر تحكم تابع لحدث KeyDown و يراقب مفتاح ESC. استدعاء أسلوب CancelEdit يمنع حدث ItemValuePushed من أن يتم رفعه . ستمثل التعليمات البرمجية مثال التعليمات البرمجية التالية:
Private Sub Child_KeyDown( ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs ) Handles txtFirstName.KeyDown, txtLastName.KeyDown If e.KeyCode = Keys.Escape Then Datarepeater1.CancelEdit() End If End Sub
private void child_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { this.dataRepeater1.CancelEdit(); } }
تطبيق المعالج لحدث NewItemNeeded . يسبب رفع هذا الحدث عندما يضيف المستخدم عنصر جديد إلى عنصر التحكم DataRepeater . سوف تشبه التعليمات البرمجية المثال التالي ، و هو لمصدر البيانات باسم Employees.
Private Sub DataRepeater1_NewItemNeeded( ) Handles DataRepeater1.NewItemNeeded Dim newEmployee As New Employee Employees.Add(newEmployee) blnNewItemNeedEventFired = True End Sub
private void dataRepeater1_NewItemNeeded(object sender, System.EventArgs e) { Employee newEmployee = new Employee(); Employees.Add(newEmployee); blnNewItemNeedEventFired = true; }
تطبيق المعالج لحدث ItemsRemoved . يحدث هذا الحدث عند قيام المستخدم بحذف عنصر موجود. سوف تشبه التعليمات البرمجية المثال التالي ، و هو لمصدر البيانات باسم Employees.
Private Sub DataRepeater1_ItemsRemoved( ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterAddRemoveItemsEventArgs ) Handles DataRepeater1.ItemsRemoved Employees.RemoveAt(e.ItemIndex) End Sub
private void dataRepeater1_ItemsRemoved(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterAddRemoveItemsEventArgs e) { Employees.RemoveAt(e.ItemIndex); }
للتحقق من صحة مستوى عنصر التحكم , نفذ المعالجات لأحداث Validating لعنصر التحكم التابع بشكل اختياري. ستمثل التعليمات البرمجية مثال التعليمات البرمجية التالية:
Private Sub Text_Validating( ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs ) Handles txtFirstName.Validating, txtLastName.Validating If txtFirstName.Text = "" Then MsgBox("Please enter a name.") e.Cancel = True End If End Sub
private void Text_Validating(object sender, System.ComponentModel.CancelEventArgs e) { if (txtFirstName.Text == "") { MessageBox.Show("Please enter a name."); e.Cancel = true; } }