Partager via


Mode virtuel dans le contrôle DataRepeater (Visual Studio)

Lorsque vous souhaitez afficher de très grandes quantités de données sous forme de tableau dans un contrôle DataRepeater, vous pouvez améliorer les performances en donnant à la propriété VirtualMode la valeur True et en gérant explicitement l'interaction du contrôle avec sa source de données.Le contrôle DataRepeater fournit plusieurs événements que vous pouvez gérer pour interagir avec votre source de données et afficher les données nécessaires au moment de l'exécution.

Fonctionnement du mode virtuel

Le scénario le plus courant pour le contrôle DataRepeater consiste à lier les contrôles enfants de ItemTemplate à une source de données au moment du design et à permettre au BindingSource de transférer des données selon les besoins.Lorsque vous utilisez le mode virtuel, les contrôles ne sont pas liés à une source de données et les données sont transférées à la source de données sous-jacente au moment de l'exécution.

Lorsque la propriété VirtualMode a la valeur True, vous créez l'interface utilisateur en ajoutant des contrôles depuis la Boîte à outils au lieu d'ajouter des contrôles liés depuis la fenêtre Sources de données.

Les événements sont déclenchés contrôle par contrôle et vous devez ajouter du code pour gérer l'affichage des données.Lorsqu'un nouveau DataRepeaterItem fait l'objet d'un défilement dans l'affichage, l'événement ItemValueNeeded est déclenché une fois par contrôle et vous devez fournir les valeurs pour chaque contrôle dans le gestionnaire d'événements ItemValueNeeded.

Si l'utilisateur modifie les données d'un des contrôles, l'événement ItemValuePushed est déclenché et vous devez valider les données et les enregistrer dans votre source de données.

Si l'utilisateur ajoute un nouvel élément, l'événement NewItemNeeded est déclenché.Utilisez le gestionnaire de cet événement pour créer un enregistrement dans votre source de données.Pour empêcher toute modification involontaire, vous devez également surveiller l'événement KeyDown pour chaque contrôle et appeler CancelEdit si l'utilisateur appuie sur la touche Échap.

Si votre source de données change, vous pouvez actualiser le contrôle DataRepeater en appelant les méthodes BeginResetTemplateItem et EndResetTemplateItem.Ces deux méthodes doivent être appelées dans l'ordre.

Enfin, vous devez implémenter des gestionnaires d'événements pour l'événement ItemsRemoved, qui se produit lorsqu'un élément est supprimé, et, facultativement, pour les événements UserDeletingItems et UserDeletedItems, qui sont déclenchés chaque fois qu'un utilisateur supprime un élément en appuyant sur la touche SUPPR.

Implémentation du mode virtuel

Les étapes suivantes sont requises pour implémenter le mode virtuel.

Pour implémenter le mode virtuel

  1. Faites glisser un contrôle DataRepeater depuis l'onglet Visual Basic PowerPacks de la Boîte à outils vers un formulaire ou un contrôle conteneur.Affectez à la propriété VirtualMode la valeur True.

  2. Faites glisser des contrôles depuis la Boîte à outils sur la région de modèle d'élément (région supérieure) du contrôle DataRepeater.Vous avez besoin d'un contrôle pour chacun des champs de la source de données que vous souhaitez afficher.

  3. Implémentez un gestionnaire pour l'événement ItemValueNeeded afin de fournir des valeurs à chaque contrôle.Cet événement est déclenché lorsqu'un nouveau DataRepeaterItem fait l'objet d'un défilement dans l'affichage.Le code se présentera comme dans l'exemple suivant, lequel concerne une source de données appelée 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. Implémentez un gestionnaire pour l'événement ItemValuePushed afin de stocker les données.Cet événement est déclenché lorsqu'un utilisateur valide des modifications apportées à un contrôle enfant de DataRepeaterItem.Le code se présentera comme dans l'exemple suivant, lequel concerne une source de données appelée 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. Implémentez un gestionnaire pour l'événement KeyDown de chaque contrôle enfant et surveillez la touche Échap.Appelez la méthode CancelEdit pour empêcher le déclenchement de l'événement ItemValuePushed.Le code ressemblera à l'exemple suivant.

    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. Implémentez un gestionnaire pour l'événement NewItemNeeded.Cet événement est déclenché lorsque l'utilisateur ajoute un nouvel élément au contrôle DataRepeater.Le code se présentera comme dans l'exemple suivant, lequel concerne une source de données appelée 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. Implémentez un gestionnaire pour l'événement ItemsRemoved.Cet événement se produit lorsqu'un utilisateur supprime un élément existant.Le code se présentera comme dans l'exemple suivant, lequel concerne une source de données appelée 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. Pour la validation au niveau du contrôle, vous pouvez implémenter des gestionnaires pour les événements Validating des contrôles enfants.Le code ressemblera à l'exemple suivant.

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

Voir aussi

Référence

ItemValuePushed

NewItemNeeded

ItemValueNeeded

Concepts

Introduction au contrôle DataRepeater (Visual Studio)