Pour faire ce que vous essayez de faire, il y a probablement une méthode beaucoup plus simple: utiliser un drapeau « modifié » ou d'un événement.
Vous pouvez mettre en cascade ce jusqu'à plusieurs niveaux de contrôles utilisateur si besoin. Il suffit de déclarer l'événement comme celui-ci:
Alors, quel que soit le niveau, vous devez vérifier réellement des modifications, accrochez tous les événements.
public class MainForm : Form
{
private bool isDataModified;
public MainForm()
{
InitializeComponent();
textBox1.TextChanged += DataModified;
textBox2.TextChanged += DataModified;
// etc.
userControl1.Modified += DataModified;
userControl2.Modified += DataModified;
// etc.
}
private void DataModified(object sender, EventArgs e)
{
isDataModified = true;
}
}
Ensuite, tout ce que vous avez à faire est de vérifier (et remise à zéro) le drapeau isDataModified
en conséquence.
Il est vraiment pas beaucoup de travail, certainement plus facile que d'assurer que INotifyPropertyChanged
est mis en œuvre pour chaque objet dans le graphique. Rappelez-vous, c'est une forme, vous ne se soucient pas vraiment que l'objet changé, vous vous souciez si l'utilisateur a fait un changement, et pour cela, vous voulez vérifier réellement les changements effectués par les contrôles.Oui, ce n'est pas parfait - vous êtes toujours confronté à la nuisance mineure de rapporter que les données ont été changées même lorsque l'utilisateur change quelque chose et le change ensuite. Mais je ne pense pas avoir jamais entendu une plainte à ce sujet, et l'utilisation de la sérialisation comme méthode de comparaison n'est tout simplement pas fiable. Ce que vous devez vraiment faire si vous voulez éliminer la confirmation de sauvegarde redondante est remplacer la méthode Equals
de chaque objet dans le graphique et implémenter une opération réelle d'égalité des valeurs. Ou, si vous ne voulez pas conserver une copie de l'ancien graphique, utilisez une fonction de génération de somme de contrôle (les collisions sont possibles mais très improbables).
Mais je voudrais juste rester avec le drapeau. N'essayez pas de tricher pour échapper aux contrôles d'égalité. C'est en quelque sorte la même chose que d'essayer d'écrire une méthode automatique de clonage profond; vous pouvez essayer, mais tout ce que vous venez avec va être cassé parfois.
Merci pour toutes les réponses, je suis au courant de la méthode IsDirty, mais je me demandais juste s'il y avait une autre façon de le faire. Maintenant, je me demande, si je sérialiser les objets en XML, serait-ce une méthode plus fiable. – sev7n