2010-02-24 9 views
2

J'ai un DataGridView rempli avec un BindingList. Cette liste est enregistrée dans le fichier de paramètres. Il enregistre et charge correctement .. mais ne sauvera la première fois que j'appelle Properties.Settings.Save(). Après cela, appeler Save() ne fera rien.Properties.Settings.Save() enregistre uniquement sur le premier appel

J'ai vérifié que Save() est appelé, et qu'au moment où il est appelé le BindingList contient les données correctes. Peu importe si j'ajoute ou supprime ou édite des éléments dans la liste, il ne sera enregistré que dans user.config au premier appel. Après cela, user.config n'est même pas ouvert pour l'édition.

Est-ce que quelqu'un sait pourquoi cela se passerait-il?

+0

Les valeurs de 'Properties.Settings.Whatever' sont-elles synchronisées avec votre BindingList sur les sauvegardes suivantes? –

+0

@Austin: Oui, le 'BindingList' lui-même est une propriété de ma classe' Settings', et en vérifiant la liste en mode debug, il a les valeurs correctes; mais, ces valeurs ne sont pas enregistrées dans user.config quand 'Save()' est appelé après la première fois –

+0

Vous devrez peut-être poster du code pour obtenir une meilleure réponse. –

Répondre

0

Je suis venu par hasard sur une solution, mais je ne sais pas pourquoi cela fonctionne.

Il semble appeler Settings.Default.MyBindingList.ResetBindings() ou Settings.Default.MyBindingList.ResetItem(1) (peu importe ce nombre est passé à ResetItem()) avant d'appeler Save() résout le problème.

Le BindingList ne doit pas avoir marqué ses valeurs comme étant modifiées, même si les éléments de la liste implémentent correctement INotifyPropertyChanged. Remarquablement, l'appel Settings.Default.MachineList.Machines.EndNew(1) résout également le problème (!?!). De l'documentation:

La méthode EndNew engage un nouvel élément en attente qui a été ajouté par la méthode AddNew. S'il n'y a aucun nouvel élément en attente d'être validé, cette méthode ne fait rien.

Quelqu'un peut-il nous éclairer à ce sujet? Est-ce que je fais quelque chose de mal, ou est-ce un bug dans DataGridView ou BindingList (ou peut-être le fournisseur Settings)?

0

L'appel à Enregistrer définit la propriété IsDirty de la classe représentant la propriété utilisateur sur false. Cette propriété est testée avant de sauvegarder la propriété de l'utilisateur sur le disque.

Si vous devez appeler Enregistrer plusieurs fois, définissez la propriété IsDirty true:

Properties.Settings.Default.PropertyValues["property name"].IsDirty = true; 
+0

Non, ça ne l'a toujours pas fait. D'autres idées? –

+0

Il écrit définitivement dans le fichier à chaque appel maintenant, mais il semble toujours écrire seulement l'information qui était valide sur le premier appel à 'Save()'. Ai-je besoin de marquer les éléments individuels dans le 'BindingList' comme sale? (Le 'BindingList' lui-même est la propriété) –

+0

Que voulez-vous dire, mais des informations" valides "? – Timores

Questions connexes