Partager via


Parcourir les données (Windows Forms .NET)

Le moyen le plus simple de parcourir les enregistrements d’une source de données consiste à lier un BindingSource composant à la source de données, puis à lier des contrôles au BindingSourcefichier . Vous pouvez ensuite utiliser la méthode de navigation intégrée du BindingSource, par MoveNextexemple , , MoveLast, MovePreviouset MoveFirst. L’utilisation de ces méthodes ajuste les propriétés et Current les Position propriétés appropriéesBindingSource. Vous pouvez également trouver un enregistrement et le définir comme enregistrement actif en définissant la Position propriété.

Pour incrémenter la position d’enregistrement dans une source de données

Définissez la Position propriété de BindingSource vos données liées sur la position d’enregistrement pour accéder à la position d’enregistrement requise. L’exemple suivant illustre l’utilisation de la MoveNext méthode de l’incrémentation BindingSource de la Position propriété lorsque vous sélectionnez le nextButton. Il BindingSource est associé à la Customers table d’un jeu de données Northwind.

private void nextButton_Click(object sender, System.EventArgs e)
{
    this.customersBindingSource.MoveNext();
}
Private Sub nextButton_Click(ByVal sender As Object,
    ByVal e As System.EventArgs) Handles nextButton.Click
    Me.customersBindingSource.MoveNext()
End Sub

Remarque

La définition de la Position propriété sur une valeur au-delà du premier ou du dernier enregistrement n’entraîne pas d’erreur, car Windows Forms ne définit pas la position sur une valeur en dehors des limites de la liste. S’il est important de savoir si vous avez dépassé le premier ou le dernier enregistrement, incluez la logique pour tester si vous dépasserez le nombre d’éléments de données.

Pour case activée que vous ayez dépassé le premier ou le dernier enregistrement

Créez un gestionnaire d'événements pour l'événement PositionChanged. Dans le gestionnaire, vous pouvez tester si la valeur de position proposée a dépassé le nombre réel d’éléments de données.

L’exemple suivant montre comment tester si vous avez atteint le dernier élément de données. Dans l’exemple, si vous êtes au dernier élément, le bouton Suivant du formulaire est désactivé.

void customersBindingSource_PositionChanged(object sender, EventArgs e)
{
    if (customersBindingSource.Position == customersBindingSource.Count - 1)
        nextButton.Enabled = false;
    else
        nextButton.Enabled = true;
}
Sub customersBindingSource_PositionChanged(ByVal sender As Object,
    ByVal e As EventArgs)

    If customersBindingSource.Position =
        customersBindingSource.Count - 1 Then
        nextButton.Enabled = False
    Else
        nextButton.Enabled = True
    End If
End Sub

Remarque

N’oubliez pas que, si vous modifiez la liste que vous naviguez dans le code, vous devez réactiver le bouton Suivant afin que les utilisateurs puissent parcourir toute la longueur de la nouvelle liste. En outre, sachez que l’événement ci-dessus PositionChanged pour l’élément spécifique BindingSource avec lequel vous travaillez doit être associé à sa méthode de gestion des événements.

Pour rechercher un enregistrement et le définir comme élément actif

Recherchez l’enregistrement que vous souhaitez définir comme élément actif. Utilisez la Find méthode de l’exemple BindingSource , comme indiqué dans l’exemple, si votre source de données implémente IBindingList. Voici quelques exemples de sources de données qui implémentent IBindingList et BindingList<T>DataView.

void findButton_Click(object sender, EventArgs e)
{
    int foundIndex = customersBindingSource.Find("CustomerID", "ANTON");
    customersBindingSource.Position = foundIndex;
}
Sub findButton_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles findButton.Click
    Dim foundIndex As Integer = customersBindingSource.Find("CustomerID",
        "ANTON")
    customersBindingSource.Position = foundIndex
End Sub

Pour vous assurer que la ligne sélectionnée dans une table enfant reste à la position correcte

Lorsque vous utilisez la liaison de données dans Windows Forms, vous affichez des données dans une vue parent/enfant ou maître/détail. Il s’agit d’un scénario de liaison de données dans lequel les données de la même source sont affichées dans deux contrôles. La modification de la sélection dans un contrôle entraîne la modification des données affichées dans le deuxième contrôle. Par exemple, le premier contrôle peut contenir une liste de clients et le second une liste de commandes associées au client sélectionné dans le premier contrôle.

Lorsque vous affichez des données dans une vue parent/enfant, vous devrez peut-être prendre des mesures supplémentaires pour vous assurer que la ligne actuellement sélectionnée dans la table enfant n’est pas réinitialisée à la première ligne de la table. Pour ce faire, vous devez mettre en cache la position de la table enfant et la réinitialiser une fois la table parente modifiée. En règle générale, la réinitialisation de la table enfant se produit la première fois qu’un champ d’une ligne de la table parente change.

Pour mettre en cache la position actuelle de la table enfant

  1. Déclarez une variable entière pour stocker la position de la table enfant et une variable booléenne pour stocker s’il faut mettre en cache la position de la table enfant.

    private int cachedPosition = -1;
    private bool cacheChildPosition = true;
    
    Private cachedPosition As Integer = -1
    Private cacheChildPosition As Boolean = True
    
  2. Gérez l’événement ListChanged pour le CurrencyManager de la liaison et vérifiez s’il y a un ListChangedType égal à Reset.

  3. Vérifiez la position actuelle du CurrencyManager. S’il est supérieur à la première entrée de la liste (généralement 0), enregistrez-la dans une variable.

    void relatedCM_ListChanged(object sender, ListChangedEventArgs e)
    {
        // Check to see if this is a caching situation.
        if (cacheChildPosition && cachePositionCheckBox.Checked)
        {
            // If so, check to see if it is a reset situation, and the current
            // position is greater than zero.
            CurrencyManager relatedCM = sender as CurrencyManager;
            if (e.ListChangedType == ListChangedType.Reset && relatedCM.Position > 0)
    
                // If so, cache the position of the child table.
                cachedPosition = relatedCM.Position;
        }
    }
    
    Private Sub relatedCM_ListChanged(ByVal sender As Object,
        ByVal e As ListChangedEventArgs)
        ' Check to see if this is a caching situation.
        If cacheChildPosition AndAlso cachePositionCheckBox.Checked Then
            ' If so, check to see if it is a reset situation, and the current
            ' position is greater than zero.
            Dim relatedCM As CurrencyManager = sender
            If e.ListChangedType = ListChangedType.Reset _
                AndAlso relatedCM.Position > 0 Then
    
                ' If so, cache the position of the child table.
                cachedPosition = relatedCM.Position
            End If
        End If
    
    End Sub
    
  4. Gérez l'événement CurrentChanged de la liste parente pour le gestionnaire de devise parent. Dans le gestionnaire, définissez la valeur booléenne pour indiquer qu’elle n’est pas un scénario de mise en cache. Si l'événement CurrentChanged se produit, la modification du parent est une modification de position dans la liste et non une modification de valeur d'élément.

    void bindingSource1_CurrentChanged(object sender, EventArgs e)
    {
        // If the CurrentChanged event occurs, this is not a caching
        // situation.
        cacheChildPosition = false;
    }
    
    ' Handle the current changed event. This event occurs when
    ' the current item is changed, but not when a field of the current
    ' item is changed.
    Private Sub bindingSource1_CurrentChanged(ByVal sender As Object,
        ByVal e As EventArgs) Handles bindingSource1.CurrentChanged
        ' If the CurrentChanged event occurs, this is not a caching 
        ' situation.
        cacheChildPosition = False
    
    End Sub
    

Pour réinitialiser la position de la table enfant

  1. Gérez l’événement PositionChanged pour la liaison de CurrencyManagertable enfant.

  2. Réinitialisez la position de la table enfant à la position mise en cache enregistrée lors de la procédure précédente.

    void relatedCM_PositionChanged(object sender, EventArgs e)
    {
        // Check to see if this is a caching situation.
        if (cacheChildPosition && cachePositionCheckBox.Checked)
        {
            CurrencyManager relatedCM = sender as CurrencyManager;
    
            // If so, check to see if the current position is
            // not equal to the cached position and the cached
            // position is not out of bounds.
            if (relatedCM.Position != cachedPosition && cachedPosition
                > 0 && cachedPosition < relatedCM.Count)
            {
                relatedCM.Position = cachedPosition;
                cachedPosition = -1;
            }
        }
    }
    
    Private Sub relatedCM_PositionChanged(ByVal sender As Object, ByVal e As EventArgs)
        ' Check to see if this is a caching situation.
        If cacheChildPosition AndAlso cachePositionCheckBox.Checked Then
            Dim relatedCM As CurrencyManager = sender
    
            ' If so, check to see if the current position is 
            ' not equal to the cached position and the cached 
            ' position is not out of bounds.
            If relatedCM.Position <> cachedPosition AndAlso
                cachedPosition > 0 AndAlso cachedPosition <
                relatedCM.Count Then
                relatedCM.Position = cachedPosition
                cachedPosition = -1
            End If
        End If
    End Sub
    

Pour tester l'exemple de code, procédez comme suit :

  1. Exécutez l'exemple.

  2. Vérifiez que la position du cache et de la réinitialisation case activée box est sélectionnée.

  3. Sélectionnez le bouton Effacer le champ parent pour provoquer une modification dans un champ de la table parente. Notez que la ligne sélectionnée dans la table enfant ne change pas.

  4. Fermez et réexécutez l’exemple. Vous devez l’exécuter à nouveau, car le comportement de réinitialisation se produit uniquement lors de la première modification de la ligne parente.

  5. Effacez le cache et réinitialisez la position case activée box.

  6. Sélectionnez le bouton Effacer le champ parent. Notez que la ligne sélectionnée dans la table enfant passe en première ligne.

Voir aussi