Bonjour,
Je rencontre un problème lors de l'ajout d'une entité en base de données :
je bind une Datagrid wpf avec une liste de civilités (M., Mme, etc...).
Voici le code d'initialisation de la fenêtre :
Et voici le code d'ajout d'une nouvelle civilité. J'utilise l'événement RowEditEnding de la datagrid qui a sa propriété canUserAddRows à true :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 protected bdd datacontext; public fen_parametre() { InitializeComponent(); bdd = new BddEntities(); } private void Page_Loaded(object sender, RoutedEventArgs e) { dg_civilite.DataContext = bdd.Civilite.OrderBy(c => c.codeCivilite); }
Lorsque j'ajoute un enregistrement, voici l'erreur rencontrée ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 private void dg_civilite_RowEditEnding(object sender, DataGridRowEditEndingEventArgs e) { if (e.EditAction == DataGridEditAction.Commit) { try { Civilite civilite = (Civilite)e.Row.Item; if (civilite.EntityState == EntityState.Detached) datacontext.AddToCivilite(civilite); datacontext.SaveChanges(); } catch (Exception ex) { MessageBox.Show(ex.InnerException.ToString()); } } }Ce qui est bizarre, c'est que l'enregistrement est bien inséré en base de données car lorsque je relance l'application, je retrouve ce nouvel enregistrement dans la datagrid.Un objet ayant la même clé existe déjà dans ObjectStateManager. L'objet existant est dans l'état Unchanged. Un objet ne peut être ajouté de nouveau à ObjectStateManager que s'il est dans l'état ajouté.
Autre question : Le fait d'avoir la propriété de la datagrid canUserAddRows a true me génère une erreur dans les sorties d'exécution :
Je suppose que cela est lié à la ligne vide réservée à l'ajout d'un nouvel enregistrement. Existe-il un moyen d'éviter ce message ? Ce message expliquerait-il le problème que je rencontre lors de l'ajout ?System.Windows.Data Error: 39 : BindingExpression path error: 'codeCivilite' property not found on 'object' ''Object' (HashCode=58324355)'. BindingExpression Path=codeCivilite; DataItem='Object' (HashCode=58324355); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
System.Windows.Data Error: 39 : BindingExpression path error: 'libelleCivilite' property not found on 'object' ''Object' (HashCode=58324355)'. BindingExpression Path=libelleCivilite; DataItem='Object' (HashCode=58324355); target element is 'TextBlock' (Name=''); target property is 'Text' (type 'String')
Merci pour vos réponses
Partager