Comment savoir si l'utilisateur a modifié les données à l'aide de bindingsource?
J'ai un DataGridView lié à un bindingsource qui est lié à un List<T>
. L'utilisateur clique sur une ligne qui va d'un formulaire avec des zones de texte, etc. Les zones de texte sont liées aux données comme suit:
if (txtID.DataBindings.Count == 0)
txtID.DataBindings.Add("Text", bindingSource, "Title");
Je veux être en mesure de détecter si l'utilisateur a modifié des données dans les contrôles lorsqu'ils cliquent sur le bouton fermer, donc je peut les amener à dire "Vous avez non enregistré travail. Voulez-vous Enregistrer?"
Comment puis-je le détecte la source de liaison?
Mise à JOUR: j'ai travaillé que je peux faire bindingSource.EndEdit()
qui pousse les changements de mon élément dans la liste. Dans mon article, je ne puis dire si elle est Sale jeter un Messagebox mais si on clique sur "Non" pour la sauvegarde de l'information, la CancelEdit ne fonctionne pas.
Vous devez vous connecter pour publier un commentaire.
Si votre objet dans la Liste de soutien de la
INotifyPropertyChanged
événement et que vous remplacez leList<T>
par unBindingList<T>
vous pouvez vous abonner à laListChanged
cas de la BindingList d'être informés des éventuelles modifications apportées par l'utilisateur.Une approche plus simple serait de vous abonner à la BindingSource de l'événement ListChanged et définir une IsDirty indicateur basé sur le type d'événement.
et définir IsDirty = true dans le cas de la méthode...
Un mot de prudence ici, il ne serait pas en mesure de détecter le moment où la valeur modifiée est toujours la même que la valeur d'origine.
Memberwise.Clone
peut être utilisé de plus, si ce niveau de précision est nécessaire.Si vous êtes lié à un ensemble de données, alors vous avez de la chance: il a un HasChanges de la Propriété. Vous pouvez obtenir les changements réels en appelant GetChanges sur le jeu de données. Cela renvoie d'un nouveau jeu de données, contenant une copie de toutes les lignes modifiées
J'ai fait cette fonction. Vous pouvez l'utiliser comme:
- Je configurer un assez simple mécanisme, comme suit:
contrôle et enregistre leurs valeurs actuelles (je fais un ReadValue() juste pour
assurez-vous que j'ai les valeurs de la source de données) dans un Dictionnaire
que des cartes de contrôle à sa valeur (il y a une petite méthode qui est
la valeur appropriée pour chaque type de contrôle que j'ai).
l'événement est déterminé par le type de contrôle, mais ils ont tous le point de
le gestionnaire de même)
de la valeur. Si c'est différent, alors il agit en conséquence (dans mon cas, c'
les commutateurs de la Près bouton pour le Annuler bouton). Si c'est la même
il vérifie tous les autres contrôles liés, de sorte que, si rien n'est
différentes, il peut passer de Annuler retour à Près; c'est une caractéristique intéressante de
cette méthode, il reconnaît également que lorsqu'une modification a été annulée,
même si c'est en entrant à nouveau la valeur d'origine.
les contrôles liés encore à faire WriteValue(), juste au cas où WinForms n'a pas
obtenir autour de la propagation de certains changements.
Je peux partager la source si quelqu'un est intéressé.
Si votre bindingsource utilise un datatable vous pouvez faire ceci :
Après avoir essayé autre chose j'ai fini avec ce morceau de code:
Il fonctionne très bien pour moi, même si je économiser beaucoup d'informations d'état dans le Formulaire Windows de champs d'instance. Cependant, en se tournant avec
CurrentChanged
etCurrentItemChanged
ne m'aide pas.De ma mise à jour de question, j'ai trouvé que j'avais pour stocker une version actuelle de l'objet à BeginEdit à l'aide de Memberwise.Clone puis dans CancelEdit j'ai restauré le courant.
BindingSource
n'ont pas deBeginEdit
etEndEdit
événements, n'est ce pas? Je suis en train de récupérer une copie de mon objet, au bon moment, mais j'ai du mal. 🙁Ce que je fais toujours, c'est de capturer l'individu "changé" les événements des contrôles. Dans l'exemple ci-dessous j'ai utilisé un tabcontrol dans cet exemple. Le Try/Catch est une solution sale pour ne pas avoir à traiter avec toutes sortes d'exceptions 😉
Je ne sont pas sûr si elle était disponible lorsque la question a été posée, mais j'utilise le grid_CurrentCellDirtyStateChanged; événement
Je sais que c'est un vieux post mais ici, c'est une longue BindingSource avec IsDirtyFlag - vous pouvez l'adapter comme vous le souhaitez - j'ai tiré ce code à partir d'un autre poster quelque part sur le net il y a des années - fait quelques modifications très mineures, je pense qu'il a été à l'origine de VB - je me suis converti à C# ..
d'abord Assurez-vous de définir DataSourceUpdateMode.OnPropertyChanged
puis ajouter ajouter ce code à votre movenext cliquez sur l'événement