Bonjour,
Je suis en train de développer une petite application C# avec des DataGridView et j'ai un problème assez embêtant.
Dans un Form, j'ai un DataGridView que je rempli avec des objets de type Person.
Une Person ressemble à ceci (je mets les propriétés en public pour réduire le code):
En gros, une Person a une liste d'Address.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public class Person { public int id; public string name; public ISet<Address> addresses = new HashedSet<Address>(); } public class Address { public int id; public Person person; public string address; }
Imaginons que j'ai les donées suivantes (toutes les données viennent d'une base de donnée avec NHibernate):
Mon application a 2 Form. Un sur lequel se trouve un DataGridView avec mes Person, l'autre sur lequel se trouve un DataGridView avec les Address.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Person p1: - id: 1 - name: TOTO - address: * id: 1 * address: my house * id: 2 * address: my office
Pour remplir la 1e grille, j'utilise le code suivant:
Lorsque je click sur un élément de ma grille, j'exécute le code suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 IList<Person> listPersons = new List<Person>(...); myPersonGrid.DataSource = listPersons;
Dans le 2e Form, je remplis la grille de la manière suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Person p = myPersonGrid.CurrentRow.DataBoundItem as Person; AddressForm myAddressForm = new AddressForm(); //Form qui contient le 2e DataGridView myAddressForm.person = p; //Je passe l'objet Person au Form myAddressForm.ShowDialog();
Dans ce Form, j'ai 2 boutons (SAVE et CANCEL).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 IList<Address> listAddresses = new List<Address>(person.addresses); myAddressGrid.DataSource = listAddresses;
Le SAVE sauve les modifications dans la BD.
Le CANCEL ferme le Form.
Lorsque je veux éditer une addresse, j'appelle le code suivant:
Si je click sur SAVE, je vois dans le log de NHibernate que l'objet Address a bien été modifié. Donc si je ferme le 2e Form et que je click à nouveau sur ma 1e grille, je verrai bien l'addresse modifiée dans le 2e Form.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Address a = myAddressGrid.CurrentRow.DataBoundItem as Address; a.address = addressTextBox.Text; // contrôle sur le Form
Maintenant, voici mon problème...
Si j'édite une addresse de mon patient, que je click sur CANCEL (donc les modifications ne sont pas sauvées) et que j'ouvre à nouveau mon 2e Form, mes modifications seront toujours là!
J'ai l'impression que c'est lié au comportement du DataSource mais je ne comprends pas car je crée à chaque fois une nouvelle List<Address> à chaque fois que j'ouvre le 2e Form.
Serait-ce aussi un problème lié à NHibernate?
Merci d'avance,
Nasedo47
Partager