共用方式為


DataRepeater 控制項中的虛擬模式 (Visual Studio)

當您想要在 DataRepeater 控制項中顯示大量的表格式資料時,只要將 VirtualMode 屬性設定為 True 並明確管理控制項與其資料來源的互動,就可以改善效能。 DataRepeater 控制項提供幾個事件,您可以處理這些事件以便與資料來源互動,並視需要於執行階段顯示資料。

虛擬模式的運作方式

DataRepeater 控制項最常見的案例是在設計階段將 ItemTemplate 的子控制項繫結到資料來源,並且視需要允許 BindingSource 來回傳遞資料。 使用虛擬模式時,控制項並不會繫結到資料來源,而且資料在執行階段會來回傳遞到基礎資料來源。

VirtualMode 屬性設定為 True 的情況下,建立使用者介面的方式是從 [工具箱] 加入控制項,而不是從 [資料來源] 視窗加入繫結控制項。

事件引發時是以一個控制項接著一個控制項的方式,所以您必須加入程式碼來處理資料的顯示。 當新的 DataRepeaterItem 被捲動到檢視處時,會為每個控制項引發 ItemValueNeeded 事件一次,因此您必須在 ItemValueNeeded 事件處理常式中為每個控制項提供值。

如果使用者變更其中一個控制項內的資料,會引發 ItemValuePushed 事件,因此您必須驗證資料並將資料儲存到資料來源。

如果使用者加入新的項目,會引發 NewItemNeeded 事件。 請使用這個事件的處理常式,以在資料來源中建立新的資料錄。 為了防止非預期的變更,您必須監視每個控制項的 KeyDown 事件,以及在使用者按 ESC 鍵的情況下,呼叫 CancelEdit

如果您的資料來源發生變更,可以藉由呼叫 BeginResetTemplateItem 和 EndResetTemplateItem 方法重新整理 DataRepeater 控制項。 這兩種方法都必須依照順序呼叫。

最後,您必須實作 ItemsRemoved 事件 (刪除項目時發生) 的事件處理常式,並選擇性地實作 UserDeletingItemsUserDeletedItems 事件 (使用者按 DELETE 鍵刪除項目時發生) 的事件處理常式。

實作虛擬模式

以下是實作虛擬模式所需的步驟。

若要實作虛擬模式

  1. DataRepeater 控制項從 [工具箱] 裡的 [Visual Basic PowerPacks] 索引標籤拖曳至表單或容器控制項。 並將 VirtualMode 屬性設定為 True。

  2. 從 [工具箱] 中將控制項拖曳到 DataRepeater 控制項的項目樣板區域 (上方區域) 上。 每一個要顯示的資料來源欄位都需要一個控制項。

  3. 實作 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;
            }
        }
    }
    
  4. 實作 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;
        }
    }
    
  5. 實作每個子控制項的 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();
        }
    }
    
  6. 實作 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;
    }
    
  7. 實作 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);
    }
    
  8. 針對控制項層級的驗證,選擇性地實作子控制項的 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;
        }
    }
    

請參閱

參考

ItemValuePushed

NewItemNeeded

ItemValueNeeded

概念

DataRepeater 控制項簡介 (Visual Studio)