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 BindingSource
fichier . 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
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
Gérez l’événement ListChanged pour le CurrencyManager de la liaison et vérifiez s’il y a un ListChangedType égal à 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 Sub
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
Gérez l’événement PositionChanged pour la liaison de CurrencyManagertable enfant.
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 :
Exécutez l'exemple.
Vérifiez que la position du cache et de la réinitialisation case activée box 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.
Effacez le cache et réinitialisez la position case activée box.
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
.NET Desktop feedback
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour