更新: 2008 年 7 月
當您想要在 DataRepeater 控制項中顯示大量的表格式資料時,只要將 VirtualMode 屬性設定為 True 並明確管理控制項與其資料來源的互動,就可以改善效能。DataRepeater 控制項提供幾個事件,您可以處理這些事件以便與資料來源互動,並視需要於執行階段顯示資料。
虛擬模式的運作方式
DataRepeater 控制項最常見的案例是在設計階段將 ItemTemplate 的子控制項繫結到資料來源,並且視需要允許 BindingSource 來回傳遞資料。使用虛擬模式時,控制項並不會繫結到資料來源,而且資料在執行階段會來回傳遞到基礎資料來源。
在 VirtualMode 屬性設定為 True 的情況下,建立使用者介面的方式是從 [工具箱] 加入控制項,而不是從 [資料來源] 視窗加入繫結控制項。
事件引發時是以一個控制項接著一個控制項的方式,所以您必須加入程式碼來處理資料的顯示。當新的 DataRepeaterItem 被捲動到檢視處時,會為每個控制項引發 ItemValueNeeded 事件一次,因此您必須在 ItemValueNeeded 事件處理常式中為每個控制項提供值。
如果使用者變更其中一個控制項內的資料,會引發 ItemValuePushed 事件,因此您必須驗證資料並將資料儲存到資料來源。
如果使用者加入新的項目,會引發 NewItemNeeded 事件。請使用這個事件的處理常式,以在資料來源中建立新的資料錄。為了防止非預期的變更,您必須監視每個控制項的 KeyDown 事件,以及在使用者按 ESC 鍵的情況下,呼叫 CancelEdit。
最後,您必須實作 ItemsRemoved 事件 (刪除項目時發生) 的事件處理常式,並選擇性地實作 UserDeletingItems 和 UserDeletedItems 事件 (使用者按 DELETE 鍵刪除項目時發生) 的事件處理常式。
實作虛擬模式
以下是實作虛擬模式所需的步驟。
若要實作虛擬模式
從 [工具箱] 的 [Visual Basic PowerPacks] 索引標籤中,將 DataRepeater 控制項拖曳到表單或容器控制項,並將 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 Subprivate 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 Subprivate 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 Subprivate 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(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles DataRepeater1.NewItemNeeded Dim newEmployee As New Employee Employees.Add(newEmployee) blnNewItemNeedEventFired = True End Subprivate 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 Subprivate 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 Subprivate void Text_Validating(object sender, System.ComponentModel.CancelEventArgs e) { if (txtFirstName.Text == "") { MessageBox.Show("Please enter a name."); e.Cancel = true; } }
請參閱
概念
DataRepeater 控制項簡介 (Visual Studio)
參考
變更記錄
日期 |
記錄 |
原因 |
|---|---|---|
|
2008 年 7 月 |
加入主題。 |
SP1 功能變更。 |