Bonjour à tous,
Dans mon auto-formation permise par le relâchement temporaire des projets internes du client chez qui je bosse actuellement, je me suis heurté à un souci bien pénible sous Visual Studio 2005 (team edition, mais on s’en cogne).
Pour faire simple, je n’arrive pas à comprendre comment faire pour que le DataGridView situé dans ma fenêtre principale d’appli mette à jour les modifications.
Pour faire détaillé, ma fenêtre comprends un objet ODBCConnection correctement initialisé, un DataGridView et un BindingSource.
J’ai récupéré dans l’aide une fonction retournant un DataTable permettant de remplir le DataGridView automatiquement (cf la fonction et son appel plus bas) et tout fonctionne au niveau de l’affichage.
Maintenant, je n’arrive pas une fois les données modifiées à appliquer les modifications en base de données.
C’'est une application toute bête de définition des droits qui ne tape que sur une table (sans primary key, je sais c’est une horreur, mais un champs peut servir de discriminant).
Autres détails, le ODBCConnection et le DataTable sont déclarés au niveau de l’objet, pas de la procédure. Il n’y a pas de souci de portée, donc.
Alors, voici déjà la petite fonction retournant le DataTable (merci l’aide MSDN) :
private DataTable GetData(string sqlCommand)
{
try
{
OdbcCommand loComm = new OdbcCommand(sqlCommand, ioCnx);
OdbcDataAdapter loAdapt = new OdbcDataAdapter();
loAdapt.SelectCommand = loComm;
DataTable loTable = new DataTable();
loTable.Locale = System.Globalization.CultureInfo.InvariantCulture;
loAdapt.Fill(loTable);
return loTable;
}
catch (Exception e)
{
MessageBox.Show(string.Concat("Erreur lors du chargement de la requête :\n", e.Message), "Erreur SQL", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
Et son appel
ioTable = GetData(string.Concat("SELECT NOM_USER, DROIT1, DROIT2 FROM UTILISATEURS", lsFiltre));
bsUtil.DataSource = ioTable;
if (bsUtil.DataSource == null)
{
SetStatus("Erreur lors du chargement, vérifiez le filtre");
return;
}
dgUtilisateurs.DataSource = bsUtil;
dgUtilisateurs.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders;
dgUtilisateurs.BorderStyle = BorderStyle.Fixed3D;
dgUtilisateurs.EditMode = DataGridViewEditMode.EditOnEnter;
Pour la fonction de mise à jour, j’ai essayé de tripatouiller les fonctions CommitEdit(), EndEdit(), AcceptChanges() respectivement du DataGridView, du BindingSource et du DataTable mais aucune modification n’a été apportée à la table.
J’imagine qu’il faut définir sur quelle colonne lancer la commande d’update mais je n’ai pas trouvé comment y arriver, quelqu’un peut m’aider please ?
Merci du temps passé à lire et encore plus du temps passé à répondre si vous savez :P.