Virtueller Modus im DataRepeater-Steuerelement (Visual Studio)

Wenn Sie sehr umfangreiche Tabellendaten in einem DataRepeater-Steuerelement anzeigen möchten, können Sie die Leistung verbessern, indem Sie die VirtualMode-Eigenschaft auf True festlegen und die Interaktion des Steuerelements mit der Datenquelle explizit verwalten. Das DataRepeater-Steuerelement stellt mehrere Ereignisse bereit, die Sie für die Interaktion mit der Datenquelle und für die benötigte Datenanzeige zur Laufzeit verarbeiten können.

Funktionsweise des virtuellen Modus

Das DataRepeater-Steuerelement wird am häufigsten verwendet, um untergeordnete Steuerelemente von ItemTemplate zur Entwurfszeit an eine Datenquelle zu binden und um zu ermöglichen, dass BindingSource Daten in beide Richtungen überträgt. Im virtuellen Modus sind die Steuerelemente nicht an eine Datenquelle gebunden. Die Daten werden zur Laufzeit von der zugrunde liegenden Datenquelle abgerufen und an diese übertragen.

Wenn die VirtualMode-Eigenschaft auf True festgelegt wurde, erstellen Sie die Benutzeroberfläche, indem Sie Steuerelemente aus der Toolbox hinzufügen, anstatt gebundene Steuerelemente aus dem Fenster Datenquellen hinzuzufügen.

Ereignisse werden für jedes Steuerelement einzeln ausgelöst, und Sie müssen Code hinzufügen, um die Datenanzeige zu verwalten. Wenn die Ansicht zu einem neuen DataRepeaterItem blättert, wird für jedes Steuerelement einmal das ItemValueNeeded-Ereignis ausgelöst. Sie müssen dann die Werte für jedes Steuerelement im ItemValueNeeded-Ereignishandler angeben.

Wenn der Benutzer Daten in einem der Steuerelemente ändert, wird das ItemValuePushed-Ereignis ausgelöst. Sie müssen die Daten anschließend validieren und in der Datenquelle speichern.

Wenn der Benutzer ein neues Element hinzufügt, wird das NewItemNeeded-Ereignis ausgelöst. Verwenden Sie den Ereignishandler, um einen neuen Datensatz in der Datenquelle zu erstellen. Um unbeabsichtigte Änderungen zu vermeiden, müssen Sie zudem das KeyDown-Ereignis für jedes Steuerelement überwachen und CancelEdit aufrufen, wenn der Benutzer die ESC-TASTE drückt.

Wenn sich die Datenquelle ändert, können Sie das DataRepeater-Steuerelement aktualisieren, indem Sie die BeginResetTemplateItem-Methode und die EndResetTemplateItem-Methode aufrufen. Beide Methoden müssen der Reihenfolge nach aufgerufen werden.

Zudem müssen Sie Ereignishandler für das ItemsRemoved-Ereignis, das beim Löschen eines Elements ausgelöst wird, und optional für die Ereignisse UserDeletingItems und UserDeletedItems implementieren. Letztere werden ausgelöst, wenn ein Benutzer ein Element über die ENTF-TASTE löscht.

Implementieren des virtuellen Modus

Im Folgenden werden die Schritte zum Implementieren des virtuellen Modus erläutert.

So implementieren Sie den virtuellen Modus

  1. Ziehen Sie ein DataRepeater-Steuerelement von der Registerkarte Visual Basic PowerPacks in der Toolbox in ein Formular- oder Containersteuerelement. Legen Sie für die VirtualMode-Eigenschaft True fest.

  2. Ziehen Sie Steuerelemente aus der Toolbox in den Elementvorlagenbereich (der obere Bereich) des DataRepeater-Steuerelements. Sie benötigen ein Steuerelement für jedes Feld in der Datenquelle, das angezeigt werden soll.

  3. Implementieren Sie einen Handler für das ItemValueNeeded-Ereignis, um Werte für jedes Steuerelement bereitzustellen. Dieses Ereignis wird ausgelöst, wenn beim Bildlauf ein neues DataRepeaterItem angezeigt wird. Der Code entspricht in etwa folgendem Beispiel für eine Datenquelle mit dem Namen 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. Implementieren Sie einen Handler für das ItemValuePushed-Ereignis, um die Daten zu speichern. Dieses Ereignis wird ausgelöst, wenn ein Benutzer Änderungen an einem untergeordneten Steuerelement von DataRepeaterItem übergibt. Der Code entspricht in etwa folgendem Beispiel für eine Datenquelle mit dem Namen 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. Implementieren Sie einen Handler für das KeyDown-Ereignis jedes untergeordneten Steuerelements, und überwachen Sie die ESC-TASTE. Rufen Sie die CancelEdit-Methode auf, um zu verhindern, dass das ItemValuePushed-Ereignis ausgelöst wird. Der Code entspricht in etwa dem folgenden Beispiel.

    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. Implementieren Sie einen Handler für das NewItemNeeded-Ereignis. Dieses Ereignis wird ausgelöst, wenn der Benutzer ein neues Element zum DataRepeater-Steuerelement hinzufügt. Der Code entspricht in etwa folgendem Beispiel für eine Datenquelle mit dem Namen 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. Implementieren Sie einen Handler für das ItemsRemoved-Ereignis. Dieses Ereignis wird ausgelöst, wenn ein Benutzer ein vorhandenes Element löscht. Der Code entspricht in etwa folgendem Beispiel für eine Datenquelle mit dem Namen 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. Implementieren Sie zur Validierung auf Steuerelementebene optional Handler für die Validating-Ereignisse der untergeordneten Steuerelemente. Der Code entspricht in etwa dem folgenden Beispiel.

    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;
        }
    }
    

Siehe auch

Referenz

ItemValuePushed

NewItemNeeded

ItemValueNeeded

Konzepte

Einführung in das DataRepeater-Steuerelement (Visual Studio)