Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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 à BindingSource. Vous pouvez ensuite utiliser la méthode de navigation intégrée du BindingSource, par exemple MoveNext, MoveLast, MovePrevious et MoveFirst. L'utilisation de ces méthodes ajustera les propriétés Position et Current de manière appropriée BindingSource. Vous pouvez également trouver un enregistrement et le définir comme enregistrement actif en définissant la Position propriété.
Pour avancer 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 méthode MoveNext du BindingSource pour incrémenter la propriété Position lorsque vous sélectionnez le nextButton.
BindingSource est associé à la table Customers 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 vérifier si vous avez 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 en tant qu'é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 la seconde une liste de commandes lié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
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 = TrueGérez l’événement ListChanged pour le CurrencyManager de la liaison et vérifiez s’il y a un ListChangedType de Reset.
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 SubGé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 le
CurrentChangedse produit, la modification apportée au 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 d'enfant
Gérez l’événement PositionChanged pour la liaison de table enfant CurrencyManager.
Réinitialisez la position de la table enfant à la position mise en cache enregistrée dans 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 :
Exécutez l’exemple.
Assurez-vous que la case à cocher Cache et réinitialiser la position est sélectionnée.
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.
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.
Décochez la case Cache et réinitialisez la position .
Sélectionnez le bouton Effacer le champ parent . Notez que la ligne sélectionnée dans la table enfant change pour devenir la première ligne.
Voir aussi
.NET Desktop feedback