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

VB.NET Discussion :

Affecter une valeur dans une cellule de DataGridView


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut Affecter une valeur dans une cellule de DataGridView
    Bonjour tous le monde,

    Je bloque sur l'affectation d'une valeur dans la cellule d'un DataGridView . Si quelqu'un pouvait me débloquer ce serait super sympa.

    J'explique le problème.

    J'ai un DataGridView qui présente des données (moyens de communication, GSM, Mail ...) venant d'une Datatable (DataGridView.DataSource = DataTable). Une fois affecté je lui ajoute une colonne permettant d'afficher les codes d'appel de ces moyens de communication.

    Au final, mon DataGridView contient donc trois colonnes dont les noms d'entête sont respectivement "idMTCom", "libMoyTele" et "codeDAppel".

    Les codes d'appels se trouve dans une autre Datatable et je souhaite les afficher dans mon DataGridView en affectant les cellules de la colonne "codeDAppel" ajoutée précédemment. Le problème, c'est que cela fonctionne pas. Remarquez que bizarrement, si je change le nom de la colonne à affecter initialement "codeDAppel" pour "libMoyTele" cela fonctionne! Bien entendu vous aurez compris que ces dans la colonne "codeDAppel" que je cherche à affecter le numéro de GSM, le mail ... et non pas dans la colonne "libMoyTele".

    je vous mets ci-dessous mes codes correspondant.

    1. Le code qui ajoute la colonne code d'appel à mon DataGridView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     Me.dgvMoyensTelecommunication.DataSource = FBase.ds.Tables("TMoyensTelecommunication")
     If dgvMoyensTelecommunication.Columns.Count < 3 Then
           Dim c As New DataGridViewTextBoxColumn    
                c.Name = "codeDAppel"   
           Me.dgvMoyensTelecommunication.Columns.Add(c)   
     End If
    2. Le code qui devrait me permettre de modifier la valeur de la cellule correspondant à la colonne "codeDAppel" dans un ligna de mon DataGridView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    For Each row As DataGridViewRow In dgvMoyensTelecommunication.Rows
           For Each rw As DataRow In FBase.ds.Tables("TFournisseursMTelecommunication").Rows
                If row.Cells.Item("idMTCom").Value.ToString = rw.Item("xidMTCom").ToString Then
                        row.Cells.Item("codeDAppel").Value = rw.Item("codeDAppel")
                        Exit For
                End If
           Next
    Next
    Est-il possible que ce soit parce que j'ajoute la colonne "codeDAppel" à mon DatagridView que je ne peux l'affecter ? Que faire pour arriver à mes fins ? Je bloque sur cette problématique depuis deux jours et j'avance plus dans mon projet.

    J'espère que je suis pas trop compliqué (ou trop technique) à comprendre mais si quelqu'un avait la gentillesse de m'aider ce serait super sympa .

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Où se trouve le code 2 ?

    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
        Private Sub gv_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgvMoyensTelecommunication.CellFormatting
     
            Dim gv as DataGridView = CType(sender, DataGridView)
     
            If (gv.Columns(e.ColumnIndex).Name.Equals("codeDAppel")) Then
     
                For Each rw As DataRow In FBase.ds.Tables("TFournisseursMTelecommunication").Rows
                    If gv.Rows(e.RowIndex).Cells("idMTCom").Value.ToString = rw("xidMTCom").ToString Then
                        gv.Rows(e.RowIndex).Cells("codeDAppel").Value = rw("codeDAppel").ToString
                        Exit For
                    End If
                Next
     
            End If
        End Sub
    Grosso modo
    "Hope for the best, but prepare for the worst."

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Bonjour Casii,

    Merci de intéresser à mon problème .

    Mais pourquoi cette question ? As-tu bien regardé les deux codes (points 1 et 2) il sont tous les deux différents.

    Peux-tu m'expliquer ton code STP ?

    Merci

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Lors du formattage de la cellule (donc pour chaque cellule), si c'est une cellule de la dernière colonne, tu remplaces la valeur (vide dans le cas présent) par celle de ta DataTable.

    Je ne suis pas sûr que ce soit recommandé, mais c'est la solution que j'ai trouvé le plus rapidement à l'époque

    Edit : J'ai édité le code, il y avait (il y en a peut-être encore ) des coquilles de copier/coller !
    "Hope for the best, but prepare for the worst."

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Ok Casii,

    Je vais essayer.

    Mais là tu mets cela dans un événement. Cet événement se déclenche quand ? au chargement de ma page ? Pour l'instant mon code 2 est appelé lors de l'ouverture de mon form. Dois-je changer l'appel de ce code via l'événement dont tu use ? cet événement sera-t-il appelé lors du chargement de mon form ?

    Mes questions sont peut-être bêtes mais j'avoue que ce problème me perturbe pas mal ... .

    Merci.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Il sera appelé à chaque fois que ton DataGridView sera modifié (en particulier lors de ton DtataGridView.DataSource = DataTable)
    "Hope for the best, but prepare for the worst."

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Merci Cassii ,

    Cela fonctionne parfaitement.

    Juste ... . Est-ce que je pourrais te demander de m'expliquer plus profondément ton code ? je ne veux pas abuser mais je ne le comprend que partiellement et donc ... .

    Pourquoi utiliser cet événement, a quoi sert-il exactement (je sais tu as déjà donner une réponse partielle avant, mais ... msdn est pas très clair). Pourquoi, je ne savait pas écrire dans les cellules de ma colonne "codedAppel" ?

    Excuse moi encore, pour cette demande, mais si tu as mis de suite le doigt sur mon problème, c'est que j'ai bien expliqué ce dernier.

    Je ne veux pas avoir bénéficié de tes services sans avoir compris parfaitement ton code. Ce ne serai pas très constructif.

    Si tu peux m'expliquer un peux mieux ce serai cool.

    Merci .

  8. #8
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    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
        Private Sub gv_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgvMoyensTelecommunication.CellFormatting
     
            Dim gv as DataGridView = CType(sender, DataGridView)
     
            ' Si on est sur une cellule de la colonne "codeDAppel"
            If (gv.Columns(e.ColumnIndex).Name.Equals("codeDAppel")) Then
     
                ' On récupère la donnée à mettre dans la cellule
                For Each rw As DataRow In FBase.ds.Tables("TFournisseursMTelecommunication").Rows
     
                    ' gv.Rows(NuméroLigne).Cells(NomColonne)
                    If gv.Rows(e.RowIndex).Cells("idMTCom").Value.ToString = rw("xidMTCom").ToString Then
                        gv.Rows(e.RowIndex).Cells("codeDAppel").Value = rw("codeDAppel").ToString
                        Exit For
                    End If
                Next
     
            End If
        End Sub
    En gros, le CellFormatting est l'événement qui est appelé lorsque chaque cellule est créée.
    Le problème est que si tu modifies les valeurs à l'affichage APRES la création pour affichage, c'est comme si tu modifiais les plans de ta maison après la construction de ta maison (superbe analogie...).

    sender = le contrôle qui a appelé l'événement (très utile si tu veux généraliser des événements du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Sub gv_CellFormatting([...]) Handles dgv1.CellFormatting, dgv2.CellFormatting, [...]
    e = Arguments utiles pour l'événement (le numéro de ligne ainsi que le numéro de colonne de la cellule en cours de formattage entre autres)

    J'ai commenté un peu pour que ce soit plus explicite

    c'est que j'ai bien expliqué ce dernier
    Ou que j'ai déjà eu ce problème...


    N'hésite pas à mettre un pouce vert
    "Hope for the best, but prepare for the worst."

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Je suis sûr que je vais avoir l'air bête avec cette question mais bon ... il faut que je comprenne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim gv as DataGridView = CType(sender, DataGridView)
    est-ce que cette partie de code signifie que tu attrapes l'objet qui est envoyé par l'événement et tu le cast au format DataGridView, puis tu l'affectes a gv. Tu le cast car au départ tu n'est pas sûr de l'objet récupéré par l'événement bien que l'événement se déclenche à chaque fois qu'on l'on crée une cellule du DataGridView.

    Ce que je dis est correct ?

    Merci.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Bonjour Cassi,

    Dans l'euphorie (si puis dire ainsi) d'avoir résolu mon problème, j'ai un peu zapé cette phrase .

    Citation Envoyé par casiii Voir le message

    Le problème est que si tu modifies les valeurs à l'affichage APRES la création pour affichage, c'est comme si tu modifiais les plans de ta maison après la construction de ta maison (superbe analogie...).
    Ta phrase est est lourde de sens pour moi car effectivement l'utilisateur de l'application doit pouvoir modifier les codes d'appel affichés. Pour l'instant et comme tu le sous entendais ce n'est pas possible !

    Peux-tu me dire comment faire ? Sans cela le code que tu m'a fourni hier ne m'aide pas !

    Merci.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par o-live Voir le message
    Je suis sûr que je vais avoir l'air bête avec cette question mais bon ... il faut que je comprenne.
    Tu le cast car au départ tu n'est pas sûr de l'objet récupéré par l'événement bien que l'événement se déclenche à chaque fois qu'on l'on crée une cellule du DataGridView.

    Ce que je dis est correct ?

    Merci.
    C'est l'inverse : je le cast parce que je suis sûr que c'est un DataGridView !

    Prends par exemple l'événement Click, tu peux l'affecter à n'importe quel contrôle (Control)
    Donc dans l'événément tu peux très bien avoir quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub MonClick_Click(sender As Object, e As EventArgs) Handles control1.Click, control2.Click, control3.Click, [...]
     
           If (TypeOf (sender) Is TextBox)
            Dim tb as TextBox = CType(sender, TextBox)
            [...]
           ElseIf (TypeOf (sender) Is Button)
            Dim btn as Nutton = CType(sender, Button)
            [...]
           End If
     
        End Sub

    Ta phrase est est lourde de sens pour moi car effectivement l'utilisateur de l'application doit pouvoir modifier les codes d'appel affichés.
    Je parlais "modifier" en ligne de code.

    Qu'entends-tu par "l'utilisateur de l'application doit pouvoir modifier les codes d'appel affichés" ? Editer directement dans ton DataGridView ? Attention, passer en mode "Edition utilisateur" dans ton DGV va relancer un CellFormatting (je crois, j'ai comme un doute tout à coup...), donc si c'est bien le cas, il faut gérer ce cas-là dans ton CellFormatting



    HS : Désolé pour la réponse tardive, quelques soucis IRL ces derniers jours et pas d'accès à un ordinateur
    "Hope for the best, but prepare for the worst."

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Bonjour Casii ,

    Pas de soucis pour la réponse tardive, je comprend parfaitement !

    Citation Envoyé par casiii Voir le message
    Qu'entends-tu par "l'utilisateur de l'application doit pouvoir modifier les codes d'appel affichés" ? Editer directement dans ton DataGridView ?
    C'est bien ça.

    Attention, passer en mode "Edition utilisateur" dans ton DGV va relancer un CellFormatting (je crois, j'ai comme un doute tout à coup...), donc si c'est bien le cas, il faut gérer ce cas-là dans ton CellFormatting
    Effectivement j'ai pu constater que le CellFormatting était relancé. La solution que j'ai trouvé est de stopper le CellFormatting via une variable Booléenne. Cela fonctionne bien d'ailleurs. Par contre cela devenait assez lourd à gérer au niveau code.

    Résultat des courses, j'ai changé mon fusil d'épaule . Ceci mérite peut-être une explication et pourra être certainement utile à d'autres qui pourraient se retrouver dans mon cas.

    Lors de l'ouverture de mon formulaire je créer dans mon dataset une table temporaire qui reprend les données nécessaire à l'affichage des codes d'appels et de leurs libellés (Gsm 254987328, ...). Précision, cette table ne sert que à ça !
    Ceci permet d'éviter l'usage l'événement CelleFormating et m'autorise de modifier (et à l'utilisateur également) les données reprises dans mon datagridview. Quand j'enregistre les données je supprime cette table du dataset de façon à ne pas surcharger ma db local.

    Je sais que certains me dirons qu'il faut réaliser cela via une jointure reprenant toutes les tables concernées (par exemple la table reprenant les contacts, les codes d'appels, les libellés ...), mais dans ce cas beaucoup de données inutiles encombreraient la db local dans le dataset. Ceci alourdissant alors très certainement les performances de l'application.

    Voila, je n'ai plus qu'a corriger un ou l'autre petit bug et ce sera bon .

    Merci pour ton aide Cassi.

    Juste pour éventuellement me conformer dans ma démarche. Peux-tu me donner ton avis sur l'orientation que j'ai prise maintenant (cfr explications ci-dessus) ?

    Encore merci en tous cas.

  13. #13
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par o-live Voir le message
    Bonjour Casii ,

    Effectivement j'ai pu constater que le CellFormatting était relancé. La solution que j'ai trouvé est de stopper le CellFormatting via une variable Booléenne. Cela fonctionne bien d'ailleurs. Par contre cela devenait assez lourd à gérer au niveau code.
    En effet, dans le projet sur lequel j'ai travaillé on passait par des formulaires pour l'édition, on a abandonné l'édition via DGV (nos DGV étaient uniquement pour de l'affichage de données ^^).


    Juste pour éventuellement me conformer dans ma démarche. Peux-tu me donner ton avis sur l'orientation que j'ai prise maintenant (cfr explications ci-dessus) ?
    Je ne peux pas te CONFORTER dans ta démarche, j'évite au maximum d'utiliser les modes add/edit/del d'un DGV (qui demande une forte liaison entre l'affichage des données et la DB), donc je ne suis pas qualifié pour commenter ta démarche !
    "Hope for the best, but prepare for the worst."

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 25
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par casiii Voir le message
    Je ne peux pas te CONFORTER dans ta démarche, j'évite au maximum d'utiliser les modes add/edit/del d'un DGV (qui demande une forte liaison entre l'affichage des données et la DB), donc je ne suis pas qualifié pour commenter ta démarche !
    Ok Casii, pas grave.

    Merci pour ton aide et l'éclairage en tous cas.

    Bonne journée.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/03/2014, 12h05
  2. quand je selectionne une valeur dans une liste, retourne une autre valeur
    Par nsqualli dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 29/12/2008, 14h23
  3. affecter la valeur d'une requete dans une variable (VB6)
    Par josémaria dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/03/2007, 14h19
  4. Réponses: 1
    Dernier message: 25/09/2006, 17h15
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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