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):
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;
}
En gros, une Person a une liste d'Address.

Imaginons que j'ai les donées suivantes (toutes les données viennent d'une base de donnée avec NHibernate):
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
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.

Pour remplir la 1e grille, j'utilise le code suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
IList<Person> listPersons = new List<Person>(...);
myPersonGrid.DataSource = listPersons;
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
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 le 2e Form, je remplis la grille de la manière suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
IList<Address> listAddresses = new List<Address>(person.addresses);
myAddressGrid.DataSource = listAddresses;
Dans ce Form, j'ai 2 boutons (SAVE et CANCEL).
Le SAVE sauve les modifications dans la BD.
Le CANCEL ferme le Form.

Lorsque je veux éditer une addresse, j'appelle le code suivant:
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
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.

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