Bonjour,
J'ai un datagridview (dtgv) qui est définie:
dtgv.Datasource = maDataTable

où maDataTable correspond au résultat d'une requête comportant plusieurs tables.

Deja, je n'ai pas réussi à faire une mise à jour de la base de données lorsqu'une cellule est modifiée.
Pourtant ma connexion se fait ainsi:
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
 
OracleConnection connexion = new OracleConnection(OraDb);
 
OracleCommand command = new OracleCommand();
command.Connection = connexion;
command.CommandText = "Select T_ID.Id, T_ID.Lib_Id, T_USR.Lib_Usr FROM T_ID, T_USR WHERE T_ID.Id = T_USR.IdUsr Order by T_ID.Id"
command.CommandType = CommandType.Text;
 
OracleDataAdapter adapter = new OracleDataAdapter();
adapter.SelectCommand = command;
 
OracleCommandBuilder builder = new OracleCommandBuilder(adapter);
 
DataSet dataset = new DataSet();
adapter.Fill(dataset, "TABLE");
 
DataTable table = dataset.Tables["TABLE"];
Pour faire la mise à jour, je met dans l'événement "CellEndEdit" de mon dtgr :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
table.Columns["Id"].Unique = true;
DataRow dr = drv.Row;
DataRow row = Dt.Rows[e.RowIndex];
row["Lib_Id"] = dr["Lib_Id"];
 
adapter.Update(dataset, "TABLE");
Ceci ne marche pas car, j'ai lu quelque part, qu'on ne pouvait pas le faire s'il y avait plusieurs tables dans la requete? Pouvez vous me confirmer ou me donner une solution ?
Moi, du coup j'ai recréé un Datatable avec juste la table T_ID et ca marche mais ca m'oblige à recharger les données!

Deuxièmement, le dtgv est en "AllowUserToAddRows=true", donc toujours dans l'événement "CellEndEdit", je fais un insert classique via les commandes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
command.CommandText = "INSERT INTO T_ID VALUES (99, \"test\")"
command.ExecuteNonQuery
Les mises à jour ou insert en base fonctionnent ainsi, même si je trouve que c'est pas très beau!

Enfin, le problème réel vient du fait qu'à la fin de cette procédure, je souhaite rafraichir le dtgv, donc je fais : dtgv.Columns.Clear();

et la, ca plante : L'opération n'est pas valide, car elle se traduit par un appel réentrant à la fonction SetCurrentCellAddressCore.

Ca fait 1 journée que je cherche, et ne comprend pas!
Merci de m'aider.