none
Multiples updates qui ne passent pas dans un dataset RRS feed

  • Question

  • Bonjour,

    comme la dernière fois j'ai vraiment eu une aide très utile sur ce site, je me permets de poser une nouvelle question.

    J'ai un DataSet qui affiche dans un Datagridview les données de deux tables Access. Mon but est qu'un utilisateur puisse faire de multiples modifications dans le datagrid, qu'il appuie sur un bouton pour enregistrer ses modifs, et que tout soit mis à jour dans le dataset et donc dans la base.

    En pratique ça ne fonctionne que pour une seule modif :-( les autres données modifiées reviennent à leur valeur d'origine après l'appui sur le bouton, et je n'ai aucune erreur ...

    Pour résumé mon code :

    J'ai un évènement sur le datagrid qui réagit lorsque la valeur d'une cellule change, à ce moment là je créé une boucle for each et dans cette boucle je stocke dans 3 collections les nouvelles valeurs des cellules, les index de colonne et ligne des cellules modifiées.

    Ensuite lorsque le user clique sur le bouton d'enregistrement ; avec une boucle for je parcours ma collection qui contient toutes les valeurs de cellules modifiées, dans cette boucle je dispose d'un select case afin de ne cibler que les bonnes cellules à mettre à jour et j'update ensuite. Mais comme expliqué il n'y a que le premier update rencontré dans la boucle qui se fait bien, les autres non.

    Je ne comprends pas pourquoi, surtout que je n'ai aucune erreur. Mon code simplifié :

    Public Sub DG_DataGrid_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DG_DataGrid.CellValueChanged Dim ContenuCellule As Object Dim IndexColonne As Integer Dim IndexLigne As Integer 'On récupère le nouveau contenu de la cellule et on stocke dans deux collections dédiées à cela, l'index de ligne et de colonne de la cellule qui a été modifiée ContenuCellule = DG_DataGrid.CurrentCell.Value IndexColonne = DG_DataGrid.CurrentCell.ColumnIndex IndexLigne = DG_DataGrid.CurrentCell.RowIndex 'A chaque modification d'une cellule, on stocke dans les classes la nouvelle valeur de la cellule, l'index de sa colonne et ligne For Each cellule As DataGridViewCell In DG_DataGrid.SelectedCells ClasseCellules.Add(ContenuCellule) ClasseIndexColonne.Add(IndexColonne) ClasseIndexLigne.Add(IndexLigne) Next End Sub Private Sub Bt_enregistrement_Click(sender As Object, e As EventArgs) Handles Bt_enregistrement.Click Dim reponse As MsgBoxResult Dim Update As OleDbCommand Dim LigneFocus As Integer Dim ColonneFocus As Integer Dim ColonneCodeArticle As Integer Dim CelluleCodeArticle As DataGridViewCell reponse = MsgBox("Êtes vous sur ?", 4161, "Confirmation d'enregistrement") If reponse = 1 Then 'Si confirmation des modifs, on va parcourir la première collection contenant toutes les modifs de cellules avec for. Ensuite vu que nous avons les index de ligne et colonne 'des cellules modifiées stockés dans respectivement LigneFocus et ColonneFocus, on peut en déduire les coordonnées des cellules contenant les valeurs de code article suivant 'là où on se trouve. On stocke ces coordonnées dans ColonneCodeArticle avec un décalage selon la donnée que l'on va modifier. 'Ensuite la requête d'update avec la donnée à modifier contenu dans la ClasseCellule For i = 1 To ClasseCellules.Count ColonneFocus = ClasseIndexColonne.Item(i) LigneFocus = ClasseIndexLigne.Item(i) Select Case ColonneFocus Case 0 ColonneCodeArticle = ColonneFocus + 1 CelluleCodeArticle = DG_DataGrid.Item(ColonneCodeArticle, LigneFocus) Update = New OleDbCommand("UPDATE Article SET Article.Libellé_Article = '" & ClasseCellules.Item(i) & "' WHERE (((Article.Code_Article)='" & CelluleCodeArticle.Value & "'))", Connexion) DataSetAdaptateur.UpdateCommand = Update DataSetAdaptateur.Update(DataSet, "DataTableCreation") DataSetAdaptateur.UpdateCommand = Update
                            DataSetAdaptateur.Update(DataSet, "DataTableCreation")

    Update.Dispose() Case 2 ColonneCodeArticle = ColonneFocus - 1 CelluleCodeArticle = DG_DataGrid.Item(ColonneCodeArticle, LigneFocus) Update = New OleDbCommand("UPDATE Article SET Article.Stock_réel = '" & ClasseCellules.Item(i) & "' WHERE (((Article.Code_Article)='" & CelluleCodeArticle.Value & "'))", Connexion) DataSetAdaptateur.UpdateCommand = Update DataSetAdaptateur.Update(DataSet, "DataTableCreation") Update.Dispose() Case 3 ColonneCodeArticle = ColonneFocus - 2 CelluleCodeArticle = DG_DataGrid.Item(ColonneCodeArticle, LigneFocus) Update = New OleDbCommand("UPDATE Article SET Article.Stock_mini = '" & ClasseCellules.Item(i) & "' WHERE (((Article.Code_Article)='" & CelluleCodeArticle.Value & "'))", Connexion) DataSetAdaptateur.UpdateCommand = Update DataSetAdaptateur.Update(DataSet, "DataTableCreation") Update.Dispose() End Select Next 'Afin de voir nos modifs apparaitre dans le DataGridView, on vide le DataSet et on le 'recharge' de nouveau ainsi que le DataGridView DataSet.Clear() DataSetAdaptateur.Fill(DataSet, "DataTableCreation") DG_DataGrid.DataSource = DataSet.Tables("DataTableCreation") Connexion.Close() End If End Sub

    Avec un exemple de mon datagrid :

    Merci d'avance de votre aide.


    • Modifié rocketter jeudi 14 avril 2016 13:49
    jeudi 14 avril 2016 13:46

Réponses

Toutes les réponses

  • J'ai tenté avec un seul Case dans mon Select Case, j'ai modifié plusieurs valeurs de la même colonne, mais toujours souci : juste le premier enregistrement est updaté, pas les autres.

    Pas moyen d'avoir la raison du pb, même avec un Try and Catch ...

    vendredi 15 avril 2016 06:57
  • Personne n'a une idée ? :-(
    lundi 18 avril 2016 06:14
  • Bonjour,

    Je pense qu'il y a plus un pb de logique dans votre code qu'un pb de codage à proprement parlé.

    Il vous faut tester ce qui s'exécute précisément.

    Donc dans votre code Bt_enregistrement_Click, mettez des Debug.Write un peu partout pour vérifier que ce qui arrive dans ce code est bien ce que vous espérez. Et à mon avis vous constaterez qu'il y a une différence.

    Genre : Debug.WriteLine(string.Format("Nombre lignes = {0}", ClasseCellules.Count);


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 18 avril 2016 07:37
  • Bonjour,

    finalement je viens de trouver, c'était tout bête, il me manquait Update.ExecuteNonQuery() pour que la requête puisse s'exécuter.

    Même si bon c'est bizarre que sans cette ligne ça passait tout de même pour un enregistrement modifié.


    • Modifié rocketter lundi 18 avril 2016 09:46
    lundi 18 avril 2016 09:43
  • Un petit conseil, surtout en voyant votre code : évitez les DataSet, DataTable & co.

    Faites de l'update avec un SqlCommand. Le code est presque aussi court et bcp plus efficace. Et en plus, vous savez ce qu'il se passe (le Update du DataSet ne fait qu'appeler un ExecuteNonQuery du SqlCommand)


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 18 avril 2016 10:11
  • Merci de votre conseil, par contre j'ai besoin d'afficher un datagrid, je peux me passer d'un dataset pour le remplir ?
    lundi 18 avril 2016 13:06
  • Non,

    Le Datagrid accepte tout IEnumerable<T>.

    Donc dans votre cas, vous créez une classe qui possède des propriétés correspondants aux colonnes.


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    lundi 18 avril 2016 18:58
  • Ok je vous remercie de vos conseils j'essaierais cette piste.
    mardi 19 avril 2016 07:38