IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

VB.Net - Comment détecter les modifications dans un Datagridview


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut VB.Net - Comment détecter les modifications dans un Datagridview
    Bonjour,

    J'utilise un DataGridView pour faire de la saisie.
    au début, la DataGridView est rempli par un DataTable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dataGridView.Datasource = DataTable
    Plus tard au moment de validation, comment puis-je détecter les lignes qui sont modifiées ou supprimées, etc ?

    Y-a-il un statut pour chaque ligne ?

    Merci beaucoup pour vos aides.

    Cdt,

  2. #2
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    J'ai trouvé, il faillait chercher du côté DataTable et non du côté DataGridView.

    Cependant, j'ai rencontré un autre problème :

    Quand je clique sur le bouton Enregistrer, le script de validation ne détecte pas le changement de la dernière cellule modifiée car le curseur y est toujour dedans.

    Comment faire par programmation pour qu'il détecte aussi la dernière cellule en modification ?

    Je vous en remercie.

    Cdt,

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par novice123 Voir le message
    Plus tard au moment de validation, comment puis-je détecter les lignes qui sont modifiées ou supprimées, etc ?
    DataTable.GetChanges()

    Citation Envoyé par novice123 Voir le message
    Y-a-il un statut pour chaque ligne ?
    Oui, chaque ligne de la DataTable a une propriété RowState

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par novice123 Voir le message
    Comment faire par programmation pour qu'il détecte aussi la dernière cellule en modification ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataGridView1.EndEdit()

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci à toi tomlev.

    Mais le dataGridView1.EndEdit() ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DataGridView1.EndEdit()
     
    Dim dt_1, dt_2 As New DataTable
    dt_1 = DataGridView1.DataSource
    dt_2 = dt_1.getChanges()
     
    Dim i As Integer
    For i = 0 To dt_2.Rows.Count - 1
          MsgBox(dt_2.Rows(i).Item(1).ToString)
    Next
    n'affiche pas la ligne encours de modif, mais si je fais sortir le curseur de la cellule encours alors j'ai la dernière ligne dans ma boucle.

    Y-a-il une option à positionner pour le DataGridView par harsard ?

    Merci à toi.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    tiens, je pensais que ça suffisait...
    essaie d'ajouter ça derrière le EndEdit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DataGridView1.CurrentRow.Selected = False

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Ca ne marche pas non plus.
    D'autres idées ?

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    pas vraiment, non...

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    dataGridView1.CommitEdit() ;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  10. #10
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Merci à Graffito mais ça ne marche pas non plus.

    J'ai essayé (séparément) avec plusieurs valeurs de la méthode:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Display)
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.CurrentCellChange)
    etc.
    avec ou sans dataGridView1.EndEdit()
    etc.

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    J'avais répondu de mémoire, mais Alzeihmer me guette
    j'ai vérifié dans mon code, c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DataGridView1.NotifyCurrentCellDirty(true);
    DataGridView1.EndEdit();
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    non plus !

    Avec la valeur True ou False c'est pareil.

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je ne sais pas comment tu te débrouilles, mais chez moi ça marche très bien, même sans bidouiller avec EndEdit, CommitEdit et autres NotifyCurrentCellDirty...

    J'ai testé avec une form dans laquelle il y a 2 DataGridView et un bouton.

    Code C# : 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
        public partial class TestDGV : Form
        {
            public TestDGV()
            {
                InitializeComponent();
     
                dt = new DataTable();
                dt.Columns.Add("Nom", typeof(string));
                dt.Columns.Add("Tel", typeof(string));
                dt.Rows.Add("toto", "01234");
                dt.Rows.Add("titi", "56789");
                dt.Rows.Add("tata", "43210");
                dt.AcceptChanges();
                dataGridView1.DataSource = dt;
            }
     
            private DataTable dt;
     
            private void button1_Click(object sender, EventArgs e)
            {
                DataTable dt2 = dt.GetChanges();
                if (dt2 != null)
                {
                    dt2.Columns.Add("RowState", typeof(DataRowState));
                    foreach (DataRow row in dt2.Rows)
                    {
                        row["RowState"] = row.RowState;
                    }
                    dataGridView2.DataSource = dt2;
                }
            }
        }

    Les changements effectués dans dataGridView1 sont affichés dans dataGridView2 quand on clique sur le bouton, y compris ceux de la ligne en cours

    EDIT: ton bouton Enregistrer, il aurait pas la propriété CausesValidation = False par hasard ? Dans ce cas, effectivement ça ne fonctionne pas, même avec dataGridView1.EndEdit(). 2 solutions :
    - mettre CausesValidation = true sur le bouton
    - appeler EndEdit sur la ligne du DataTable qui est en cours d'édition dans le DGV :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CType(dataGridView1.CurrentRow.DataBoundItem, DataRowView).EndEdit()
    Et cette fois c'est testé, alors ne me dis pas que ça marche pas

  14. #14
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Je suis en VB et non en C#. C'est ça l'explication ?

    Je n'ai pas de bouton dans la form, je déclenche la validation depuis le menu d'une MDI.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub SaveToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveToolStripButton.Click
            Dim fen As New Ecran_produits
            fen = ActiveMdiChild
            fen.Validation("")
        End Sub
    Dans la form de Ecran_produits, à l'ouverture de l'écran:
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Private Sub Ecran_produits_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
       Dim serviceDAO As New PRODUITS_DAO
       Dim table As New DataTable
       ' charger la dataTable
       table = serviceDAO.getContenuPRODUITS()
       If table.Rows.Count < 1 Then Return
     
       ' Init.
       DataGridView1.Columns.Clear()
       ' charger la datagridview
       DataGridView1.DataSource = table
    End Sub
     
    Public Sub Validation(ByVal param As String)
     
           CType(dataGridView1.CurrentRow.DataBoundItem, DataRowView).EndEdit()
     
            Dim dt_1, dt_2 As New DataTable
            dt_1 = Me.DataGridView1.DataSource
     
     
            dt_2 = dt_1.GetChanges
            Dim i As New Integer
            For i = 0 To dt_2.Rows.Count - 1
                MsgBox(dt_2.Rows(i).Item(1).ToString)
            Next
    End Sub
    Et je n'ai pas la cellule en cours de modif dans le boucle.
    Il n' y a pas de CausesValidation pour le menu.
    Tu vois des erreurs dedans ?
    Tiens ! Je vais essayer avec un bouton directement dans la form
    ...

  15. #15
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Je viens de tester avec un bouton directement dans la form et CA MARCHE !

    Mais je passe par les menus d'une MDI pour valider ?!

    Comment faire ? Je ne vais pas appeler le bouton (caché) depuis un menu quand même ! ça fait... bidouiller !

    une idée please !

  16. #16
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    J'ai compris la différence.

    Quand on clique sur le bouton, le bouton récupère le focus qui provoque la sortie du curseur de la cellule en cours ce qui valide la saisie.

    Le menu ne récupère pas le focus quand on clique dessus, le curseur reste toujours dans la cellule en cours.

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par novice123 Voir le message
    Je suis en VB et non en C#. C'est ça l'explication ?
    Ca ne change rien

    Citation Envoyé par novice123 Voir le message
    Je n'ai pas de bouton dans la form, je déclenche la validation depuis le menu d'une MDI.
    Ah ok, le menu est dans la Form MDI parente ? Dans ce cas je ne suis pas sûr que ça déclenche la validation du DataGridView... Essaie d'appeler fen.ValidateChildren() dans ton SaveToolStripButton_Click

    Par contre c'est bizarre que ça marche pas avec EndEdit() sur le DataRowView...

  18. #18
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 29
    Points : 13
    Points
    13
    Par défaut
    Super ! CA MARCHE avec fen.ValidateChildren() dans le script de menu.

    Merci beaucoup à vous deux.


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/05/2014, 13h11
  2. Réponses: 0
    Dernier message: 15/07/2009, 15h52
  3. [VB.NET]Comment supprimer les lignes d'un datagridView
    Par vijeo dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/09/2006, 17h54
  4. Réponses: 11
    Dernier message: 24/08/2006, 11h22
  5. [C#] Comment empecher les modification dans un DataGrid ?
    Par layate dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/06/2005, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo