Meilleur auteur de réponses
Enregistrement parent / enfant

Question
-
j'ai 2 tables,
profils_id (parent) avec champ RefNo autoincrementé, profils_pro (enfant) avec un champ RefNo qui doit recuperer la valeur du champ RefNo de la table profils_id.
le dataset contient les 2 tables et une relation entre les deux tables sur le champ RefNo.
lorsque j'enregistre un nouveau profil les données sont bien enregistrer dans les deux tables, mais le champ RefNo de la table profils pro (enfant) contient -1.
comment faire pour pour que cette valeur contienne la valeur de la table profils_id RefNo, et comment rafraichir les données dans le formulaire.
voici le code pour l'enregistrement.
private
void profils_idBindingNavigatorSaveItem_Click(object sender, EventArgs e)
{
this.Validate();
this.profils_idBindingSource.EndEdit();
this.profils_proBindingSource.EndEdit();
this.tableAdapterManager.UpdateAll(this.cvt2010DataSet);
}
merci par avance pour votre aide.
Réponses
-
Bonjour thomas,
J’ai bien reçu ton programme et je te remercie.
Effectivement en recréant mes tables sur SQLSERVEUR cela fonctionne, mais pas sur MYSQL.
J’ai donc regardé de plus près quelles étaient les différences entre SQLSERVEUR et MYSQL, et je me suis rendu compte d’une différence majeure lors de la création de la requête INSERT de la table Parent.
Sur SQL après l’instruction insert une instruction SELECT est rajoutée pour rafraichir le champ Id, et voilà donc pourquoi cela fonctionne sur SQL et pas sur MYSQL.
En résumer pour ceux qui utilisent MYSQL, pour que le champ en relation se mette à jour dans la table enfant, Il faut modifier la commande INSERT de la manière suivante :
“INSERT INTO TableParent (Col1,Col2) VALUES(@Param1,@Param2) ;SELECT Id,Col1,Col2 FROM TableParent WHERE Id=@@IDENTITY”.
Avec une relation sur la colonne Parent.idàEnfant.id, et une contrainte de clé étrangère qui définit la règle de mise à jour sur cascade, le champ id de la table enfant est mis à jour correctement.
Exemple complet :
DataSet ds = new DataSet("MonDataSet");
MySqlConnection Connection = new MySqlConnection(connectionString);
#region TableParent (Master)
MySqlDataAdapter daParent = new MySqlDataAdapter();
//-->Select
sql = "SELECT Id,Col1,Col2 FROM tableparent“;
cmd = new MySqlCommand(sql, Connection);
daParent.SelectCommand = cmd;
//--->Insert
sql = "INSERT INTO tableparent (Col1,Col2) VALUES (@Col1,@Col2); SELECT Id,Col1,Col2 FROM tableparent WHERE Id=@@IDENTITY";
cmd = new MySqlCommand(sql, Connection);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@Id", MySqlDbType.Int32, 0, "Id");
cmd.Parameters["@Id"].Direction = ParameterDirection.Output;
cmd.Parameters.Add("@Col1", MySqlDbType.String, 50, "Col1");
cmd.Parameters.Add("@Col2", MySqlDbType.String, 50, "Col2");
daParent.InsertCommand = cmd;
cmd.UpdatedRowSource = UpdateRowSource.Both;
#endregion
#region TableEnfant (Child)
MySqlDataAdapter daEnfant = new MySqlDataAdapter();
//-->Select
sql = "SELECT Id,IdParent,Col1,Col2 FROM tableenfant“;
cmd = new MySqlCommand(sql, Connection);
daEnfant.SelectCommand = cmd;
//--->Insert
sql = "INSERT INTO tableenfant (IdParent,Col1,Col2) VALUES (@IdParent,@Col1,@Col2)";
cmd = new MySqlCommand(sql, Connection);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@IdParent", MySqlDbType.Int32, 0, "IdParent");
cmd.Parameters.Add("@Col1", MySqlDbType.String, 50, "Col1");
cmd.Parameters.Add("@Col2", MySqlDbType.String, 50, "Col2");
daEnfant.InsertCommand = cmd;
cmd.UpdatedRowSource = UpdateRowSource.Both;
#endregion
#region Relation (Master-->Child)
// Create Relation TableParent --> TableEnfant
DataColumn col1 = ds.Tables["TableParent"].Columns["Id"];
DataColumn col2 = ds.Tables["TableEnfant"].Columns["IdParent"];
// constraint
ForeignKeyConstraint FK = new ForeignKeyConstraint(“FKParentEnfant”, col1, col2);
FK.DeleteRule = Rule.Cascade;
FK.UpdateRule = Rule.Cascade;
FK.AcceptRejectRule = AcceptRejectRule.None;
ds.Tables[TableEnfant].Constraints.Add(FK);
ds.EnforceConstraints = true;
// Relation
DataRelation dr = new DataRelation("FKParentEnfant", col1, col2, false);
ds.Relations.Add(dr);
#endregion
Connection.Open();
daParent.Fill(ds,”TableParent”);
daEnfant.Fill(ds,”TableEnfant”);
Connection.Close();
// BINDINGSOURCE
bindingSourceParent.DataSource = ds;
bindingSourceParent.DataMember = "TableParent";
bindingSourceEnfant.DataSource = bindingSourceParent;
bindingSourceEnfant.DataMember = "FKParentEnfant";
// Enregistrement
this.Validate();
bindingSourceParent.EndEdit();
daParent.Update(ds.Tables["TableParent"]);
bindingSourceEnfant.EndEdit();
daEnfant.Update(ds.Tables["TableEnfant"]);
Cordialement
Bertrand.- Marqué comme réponse Bertrand2011 vendredi 21 janvier 2011 22:16
Toutes les réponses
-
Bonjour,
Normalement, avec une BindingSource, cela devrait fonctionner de lui-même.
Plusieurs pistes pour résoudre le problème :
- La relation est-elle bien déclarée en ForeignKey dans le DataSet ?
- Les règles d'Update de la relation sont-elles activées ? Il ne faut pas qu'elles soient à None, je me souviens plus trop ce qu'il faut mais il doit exister un Cascade.
Sinon, plutôt que de faire un UpdateAll, essayer de faire d'abord l'Update de la table PArent, puis ensuite celle de la table Enfant.
Cordialement,
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
lorsque j'active la relation Foreignkey cascade pour update et delete j'obtient l'erreur suivante :
System.Data.invalidconstraintexception : foreignkeyconstraint FK_profils_id_profils_pro a besoin des valeurs de cle enfant (-1) dans la table parente etc....
-
Bonjour,
Tu as remplacé ton UpdateAll avec des updates dans l'ordre d'abord le parent, ensuite l'enfant ?
Si c'est déjà le cas, essaie de désactiver les Constraints dans ton DataSet pour voir ce que cela donne.
Cordialement,
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Bonjour,
Je viens de penser à un truc !!
Pour le BindingSource, pour la table parent il faut utiliser un BindingSource qui lit les données de la table parent, mais pour la table enfant, il faut utiliser un bindingsource qui utilise la Foreign Key !
Donc dans la définition du bindinsource enfant, il faut mettre comme DataSource le Bindingsource issu de la FK vers le parent.
Si ce n'est pas clair, je dois pouvoir trouver un article qui explique cela bien mieux que moi :)
Cordialement,
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Voilà un article qui explique ça : http://www.dotnet-forms.info/Addison.Wesley-Data.Binding.with.Windows.Forms.2.0-Programming.Smart.Client.Data.Applications.with..NET/032126892X/ch04lev1sec3.html
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Bonjour,
Thomas, merci pour les réponses de ce thread !
Bertrand2011, je vous remercie de nous tenir au courant avec l’évolution de votre projet et de nous dire si les informations de Thomas vous ont aidé.
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
-
Désolé de ne pas avoir répondu avant, mais j'étais sur d'autres choses.
Tout d'abord merci pour l'article,
Non mon problème n'est pas résolu, ma relation fonctionne pour Select, Update
mais pas pour insert (le champ RefNo de la table enfant n'est pas renseigné avec la valeur du champ en relation de la table parent).
J’explore une autre piste avec l'évènement RowUpdated sur le DataAdapter parent et enfant.
Merci pour votre aide
Cordialement
Bertrand
-
Bonjour,
Si vos recherches donnent des résultats, je vous remercie de nous tenir au courant dans ce thread.
Cordialement,
Alex
________________
Astuces pour Visual Studio 2010
XNA – Développement jeux vidéo
Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, SharePoint, WPF
Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.
-
Bonjour Bertrand,
Je dois avouer que je suis étonné que cela ne fonctionne pas.
Peux-tu nous dire ce que les BindingSource profils_idBindingSource et profils_proBindingSource ont comme DataSource et DataMember ?
Voilà à quoi cela devrait ressembler :
profils_idBindingSource.DataSource = MonDataSet; profils_idBindingSource.DataMember = "profils_id"; profils_proBindingSource.DataSource = profils_idBindingSource; profils_proBindingSource.DataMember = "FK_Profils_Id_Profils_Pro"; // Le nom de votre relation
Parce qu'on est dans le cas standard Maitre/Detail, qui ne devrait te poser aucun problème.
Je te mets le lien sur la MSDN : http://msdn.microsoft.com/fr-fr/library/c12c1kx4.aspx
Cordialement,
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Bonjour thomas,
Je te joins une synthèse de mon code, je pense que ça sera plus facile d’en discuter par la suite.
private DataSet dsProfils;
private DataTable dtProfils_id, dtProfils_pro;
private MySqlDataAdapter daProfils_id, daProfils_pro;
private MySqlConnection Connection;
dsProfils = new DataSet("ProfilDataSet");
Connection = new MySqlConnection(connectionString);
//àprofils_id (Master)
daProfils_id = new MySqlDataAdapter();
daProfils_id.SelectCommand = new MySqlCommand("SELECT RefNo,Nom,Prenom FROM profils_id", Connection);
daProfils_id.SelectCommand.CommandType = CommandType.Text;
daProfils_id.InsertCommand = new MySqlCommand("INSERT INTO profils_id (Nom,Prenom) VALUES (@Nom,@Prenom)", Connection);
daProfils_id.InsertCommand.CommandType = CommandType.Text;
// Add the parameter for the daProfils_id InsertCommand.
MySqlParameter parameter = daProfils_id.InsertCommand.Parameters.Add("@RefNo", MySqlDbType.Int32, 0, "RefNo");
parameter.Direction = ParameterDirection.Output;
daProfils_id.InsertCommand.Parameters.Add("@Nom", MySqlDbType.String, 50, "Nom");
daProfils_id.InsertCommand.Parameters.Add("@Prenom", MySqlDbType.String, 50, "Prenom");
daProfils_id.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;
daProfils_id.FillSchema(dsProfils, SchemaType.Source);
dtProfils_id = dsProfils.Tables[0];
dtProfils_id.TableName = "profils_id";
//àprofils_pro (Détail)
daProfils_pro = new MySqlDataAdapter();
daProfils_pro.SelectCommand = new MySqlCommand("SELECT ID,RefNo,Code_Qualif FROM profils_pro", Connection);
daProfils_pro.SelectCommand.CommandType = CommandType.Text;
daProfils_pro.InsertCommand = new MySqlCommand("INSERT INTO profils_pro (RefNo,Code_Qualif) VALUES (@RefNo,@Code_Qualif)", Connection);
daProfils_pro.InsertCommand.CommandType = CommandType.Text;
MySqlParameter parameter =
daProfils_pro.InsertCommand.Parameters.Add("@RefNo", MySqlDbType.Int32, 0, "RefNo");
daProfils_pro.InsertCommand.Parameters.Add("@Code_Qualif", MySqlDbType.Int32,5, "Code_Qualif");
daProfils_pro.InsertCommand.UpdatedRowSource = UpdateRowSource.Both;
daProfils_pro.FillSchema(dsProfils, SchemaType.Source);
dtProfils_pro = dsProfils.Tables[1];
dtProfils_pro.TableName = "profils_pro";
//àRelation
DataColumn parentColumn = dsProfils.Tables[“profils_id”].Columns[“RefNo”];
DataColumn childColumn = dsProfils.Tables[“profils_pro”].Columns[“RefNo”];
// Create DataRelation.
DataRelation relCustOrder = new DataRelation(“IDPRO”, parentColumn, childColumn, false);
// Add the relation to the DataSet.
dsProfils.Relations.Add(relCustOrder);
Connection.Open();
daProfils_id.Fill(dtProfils_id);
daProfils_pro.Fill(dtProfils_pro);
Connection.Close();
//àcode form_load
ProfilbindingSource.DataSource = DataPid.DataSetProfils;
ProfilbindingSource.DataMember = "profils_id";
RefnotextBox.DataBindings.Add("Text", ProfilbindingSource, "RefNo");
NomtextBox.DataBindings.Add("Text", ProfilbindingSource, "Nom");
PrenomtextBox.DataBindings.Add("Text", ProfilbindingSource, "Prenom");
ProbindingSource.DataSource = ProfilbindingSource;
ProbindingSource.DataMember = "IDPRO";
dataGridView1.DataSource = ProbindingSource;
//àcode save
this.Validate();
ProfilbindingSource.EndEdit();
DataPid.ConnectionProfilsID.Open();
DataPid.DataAdapterProfilsID.Update(DataPid.DataTableProfilsID);
DataPid.DataAdapterProfilsPRO.Update(DataPid.DataTableProfilsPRO);
DataPid.ConnectionProfilsID.Close();
PS
Aujourd’hui j’ai testé l’évènement rowupdated sur le DataAdapter profils_id qui exécute une requête du type « SELECT @@IDENTITY FROM profils_id » pour retourner le RefNo et une procédure juste avant l’update de profils_pro qui met à jour le paramètre @RefNo cela fonctionne. Mais je pense que la mise à jour du paramètre @RefNo devrait s’alimenter tout seul grâce à la relation ???
Cordialement
Bertrand
-
Bonjour Bertrand,
Alors je regarde ton code, et ça m'a l'air plutôt bon, SAUF ... Et oui, y'a toujours un sauf ;)
Sauf que je ne vois pas à quel moment tu choisis la ligne sur laquelle ta BindingSource Master est sélectionnée.
Car pour que la relation fonctionne, il faut qu'une ligne Master ait été sélectionnée dans ton BindingSource.
Dans ton code, pour les données Master, tu les affectes dans des TextBox, ce qui m'étonne.
En général, les données Master, tu les affiches dans une Gridview ou au moins une ComboBox, dans laquelle tu sélectionnes la ligne Master qui t'intéresse et qui te permet de filtrer automatiquement les données Details correspondantes.
En gros, ce que je te propose, c'est de garder ton code, sauf qu'au lieu de mettre une TextBox RefnotextBox, mets une ComboBox, avec Datasource = ProfilbindingSource, DataMember = "RefNo".
Ensuite il faut vérifier que :
- lorsque tu sélectionnes différents RefNo dans ta Combobox, la grille se met à jour toute seule avec les bonnes données Profil.
- lorsque tu ajoutes une ligne dans ta gridview, le RefNo est bien renseigné avec celui du Master.
Cordialement,
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Bonjour thomas,
J’ai testé avec un combobox et le résultat est le même, puisque en réalité le problème vient du fait que la table maitre génère temporairement une valeur pour le champ RefNo (-1), et que celui-ci est utiliser des que je saisi des valeurs dans la table enfant.
En faisant après l’update de la table maitre:
foreach (DataRow row in test.dsProfils.Tables["profils_pro"].Rows)
{
if (row.RowState == DataRowState.Added)
{
row["RefNo"] = test.RefNo.ToString();//à contient le lastinsertid
}
}
test.daProfils_PRO.Update(test.dsProfils.Tables[
"profils_pro"]);"profils_pro"]);
Le problème est résolu, mais si je suis obligé de faire ca sur toutes les tables qui vont êtres liées (8) lors de l’ajout d’un profil dans la cvthèque cela risque d’être long.
Maintenant peut être que c’est la seule solution, mais j’aimerai que tu me le confirme.
PS
Ce code est en aucun cas le code définitif mais juste un essai pour comprendre le principe d’une relation dans c#,
en vue d’un portage d’appli que j’ai déjà développé en delphi, c’est la raison pour la qu’elle le refno est dans un textbox,
et que j’utilise des boutons pour naviguer.
Merci de ton aide
Cordialement
Bertrand
-
Bonjour Bertrand,
Si tu as la patience d'attendre ce soir vu que je n'ai pas de VS ici, j'aimerais bien que tu m'envoies ton mini projet de simulation, car j'aimerais le tester.
Mon mail : tai (at) sharplog (point) fr
Comme ça je ferai 2 choses :
1. T'envoyer un exemple qui fonctionne que tu puisses le regarder si t'as le temps.
2. Analyser où est-ce que ça cloche dans ton code, car je suis sûr que c'est un petit truc.
Pour l'analyse, je voudrais que tu me dises exactement quelle est la manip que tu réalises et le comportement attendu. Par exemple, lors de ton cas d'utilisation, la ligne Master existe-t-elle toujours ou bien la crées-tu elle aussi au vol ? Si elle existe, je suppose que tu l'updates ou même pas ?
Pour l'exemple que je vais t'envoyer, tu veux quoi ? Vu que ca devrait pas me prendre plus de 10 minutes, je peux te faire une dépendance entre une combobox et une grille, ou entre 2 grilles, ou autre, comme tu le souhaites.
Cordialement,
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Bonsoir Thomas,
Je vais t'envoyer de suite le petit projet en question, ainsi que la structure de la base.
La situation est simple, j'ai un formulaire de saisie qui correspond à tous les champs des tables :
profils_la,profils_lg,profils_pro,pofils_mobilite,profils_codecalcul,profils_habilitation,profils_secteur qui sont reliées par le champ RefNo de profils_id.
l'utilisateur rempli le formulaire puis une fois celui-ci completé, un bouton Save permet de lancer l'enregistrement dans la base.
Donc le refno n'existe pas encore pendant la saisie et sera générer au vol, d'où l'interêt de la relation et du paramètre @refno qui selon moi devrait mettre à jour le champ refno des tables détails.
pour info j'utilise les drivers .net mysql 6.3.6 (http://dev.mysql.com/downloads/connector/net/).
PS
La prochaine étape sera d'enregistrer le formulaire au format xml (avant la maj de la base juste pour garder en local une trace de la saisie au cas où il y aurait un problème) et donc de pouvoir lire ce fichier pour éviter de devoir remplir à nouveau le formulaire.
Encore merci pour ton aide.
Cordialement,
bertrand
-
Bonsoir Bertrand,
Je viens de t'envoyer un exemple qui résout ton problème, je te laisse tester et jouer avec. Pour l'analyse, comme je te disais dans le mail, je n'ai pas eu ta BD ni ton DataSet, donc difficile d'avancer.
Mais l'exemple reprend ta problématique, et fait ce qui est demandé.
Si cela te parait convaincant, j'en mettrai les idées directrices ici :)
Allez, je file au dodo, lever dans 4h :D
Cordialement,
Thomas
PS : pour le format XML, je te propose qu'on ouvre un nouveau thread a ce moment-là ;)
Et de rien, tout le plaisir est pour moi !
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr -
Bonjour thomas,
J’ai bien reçu ton programme et je te remercie.
Effectivement en recréant mes tables sur SQLSERVEUR cela fonctionne, mais pas sur MYSQL.
J’ai donc regardé de plus près quelles étaient les différences entre SQLSERVEUR et MYSQL, et je me suis rendu compte d’une différence majeure lors de la création de la requête INSERT de la table Parent.
Sur SQL après l’instruction insert une instruction SELECT est rajoutée pour rafraichir le champ Id, et voilà donc pourquoi cela fonctionne sur SQL et pas sur MYSQL.
En résumer pour ceux qui utilisent MYSQL, pour que le champ en relation se mette à jour dans la table enfant, Il faut modifier la commande INSERT de la manière suivante :
“INSERT INTO TableParent (Col1,Col2) VALUES(@Param1,@Param2) ;SELECT Id,Col1,Col2 FROM TableParent WHERE Id=@@IDENTITY”.
Avec une relation sur la colonne Parent.idàEnfant.id, et une contrainte de clé étrangère qui définit la règle de mise à jour sur cascade, le champ id de la table enfant est mis à jour correctement.
Exemple complet :
DataSet ds = new DataSet("MonDataSet");
MySqlConnection Connection = new MySqlConnection(connectionString);
#region TableParent (Master)
MySqlDataAdapter daParent = new MySqlDataAdapter();
//-->Select
sql = "SELECT Id,Col1,Col2 FROM tableparent“;
cmd = new MySqlCommand(sql, Connection);
daParent.SelectCommand = cmd;
//--->Insert
sql = "INSERT INTO tableparent (Col1,Col2) VALUES (@Col1,@Col2); SELECT Id,Col1,Col2 FROM tableparent WHERE Id=@@IDENTITY";
cmd = new MySqlCommand(sql, Connection);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@Id", MySqlDbType.Int32, 0, "Id");
cmd.Parameters["@Id"].Direction = ParameterDirection.Output;
cmd.Parameters.Add("@Col1", MySqlDbType.String, 50, "Col1");
cmd.Parameters.Add("@Col2", MySqlDbType.String, 50, "Col2");
daParent.InsertCommand = cmd;
cmd.UpdatedRowSource = UpdateRowSource.Both;
#endregion
#region TableEnfant (Child)
MySqlDataAdapter daEnfant = new MySqlDataAdapter();
//-->Select
sql = "SELECT Id,IdParent,Col1,Col2 FROM tableenfant“;
cmd = new MySqlCommand(sql, Connection);
daEnfant.SelectCommand = cmd;
//--->Insert
sql = "INSERT INTO tableenfant (IdParent,Col1,Col2) VALUES (@IdParent,@Col1,@Col2)";
cmd = new MySqlCommand(sql, Connection);
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@IdParent", MySqlDbType.Int32, 0, "IdParent");
cmd.Parameters.Add("@Col1", MySqlDbType.String, 50, "Col1");
cmd.Parameters.Add("@Col2", MySqlDbType.String, 50, "Col2");
daEnfant.InsertCommand = cmd;
cmd.UpdatedRowSource = UpdateRowSource.Both;
#endregion
#region Relation (Master-->Child)
// Create Relation TableParent --> TableEnfant
DataColumn col1 = ds.Tables["TableParent"].Columns["Id"];
DataColumn col2 = ds.Tables["TableEnfant"].Columns["IdParent"];
// constraint
ForeignKeyConstraint FK = new ForeignKeyConstraint(“FKParentEnfant”, col1, col2);
FK.DeleteRule = Rule.Cascade;
FK.UpdateRule = Rule.Cascade;
FK.AcceptRejectRule = AcceptRejectRule.None;
ds.Tables[TableEnfant].Constraints.Add(FK);
ds.EnforceConstraints = true;
// Relation
DataRelation dr = new DataRelation("FKParentEnfant", col1, col2, false);
ds.Relations.Add(dr);
#endregion
Connection.Open();
daParent.Fill(ds,”TableParent”);
daEnfant.Fill(ds,”TableEnfant”);
Connection.Close();
// BINDINGSOURCE
bindingSourceParent.DataSource = ds;
bindingSourceParent.DataMember = "TableParent";
bindingSourceEnfant.DataSource = bindingSourceParent;
bindingSourceEnfant.DataMember = "FKParentEnfant";
// Enregistrement
this.Validate();
bindingSourceParent.EndEdit();
daParent.Update(ds.Tables["TableParent"]);
bindingSourceEnfant.EndEdit();
daEnfant.Update(ds.Tables["TableEnfant"]);
Cordialement
Bertrand.- Marqué comme réponse Bertrand2011 vendredi 21 janvier 2011 22:16
-
Bonjour Bertrand,
Merci d'avoir mis l'explication :)Bonne continuation !
Thomas
Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr