DataRepeater 控制項中的虛擬模式 (Visual Studio)
當您想要在 DataRepeater 控制項中顯示大量的表格式資料時,只要將 VirtualMode 屬性設定為 True 並明確管理控制項與其資料來源的互動,就可以改善效能。 DataRepeater 控制項提供幾個事件,您可以處理這些事件以便與資料來源互動,並視需要於執行階段顯示資料。
虛擬模式的運作方式
DataRepeater 控制項最常見的案例是在設計階段將 ItemTemplate 的子控制項繫結到資料來源,並且視需要允許 BindingSource 來回傳遞資料。 使用虛擬模式時,控制項並不會繫結到資料來源,而且資料在執行階段會來回傳遞到基礎資料來源。
在 VirtualMode 屬性設定為 True 的情況下,建立使用者介面的方式是從 [工具箱] 加入控制項,而不是從 [資料來源] 視窗加入繫結控制項。
事件引發時是以一個控制項接著一個控制項的方式,所以您必須加入程式碼來處理資料的顯示。 當新的 DataRepeaterItem 被捲動到檢視處時,會為每個控制項引發 ItemValueNeeded 事件一次,因此您必須在 ItemValueNeeded 事件處理常式中為每個控制項提供值。
如果使用者變更其中一個控制項內的資料,會引發 ItemValuePushed 事件,因此您必須驗證資料並將資料儲存到資料來源。
如果使用者加入新的項目,會引發 NewItemNeeded 事件。 請使用這個事件的處理常式,以在資料來源中建立新的資料錄。 為了防止非預期的變更,您必須監視每個控制項的 KeyDown 事件,以及在使用者按 ESC 鍵的情況下,呼叫 CancelEdit。
如果您的資料來源發生變更,可以藉由呼叫 BeginResetTemplateItem 和 EndResetTemplateItem 方法重新整理 DataRepeater 控制項。 這兩種方法都必須依照順序呼叫。
最後,您必須實作 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; } }