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 :

Manipuler des lignes entières avec une DataGridView


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut Manipuler des lignes entières avec une DataGridView
    Bonjour,

    Je tente de réécrire sous VB Express 2005 une petite application que j'avais réalisée en VB6 et tant qu'à me prendre la tête, je voudrais profiter de certaines améliorations de VB Net.
    J'utilisais une MSFLEXGRID comme une grille de calcul et je suis donc passé à la DataGridView.

    Pour les manipulations des contenus de cellules par la propriété Value j'utilise indifféremment MaGrille.Items (x,y).value = variable ou MaGrille.Rows(y).Cells(x).Value = variable D’ailleurs sans savoir la différence fondamentale entre les deux méthodes ni leurs avantages respectifs.

    Pour ajouter des lignes entières ou en insérer, ça va encore, avec les méthodes add ou insert de DataGridViewRowCollection

    par contre, pour remplacer des contenus de lignes ou de blocs de plusieurs lignes par d'autres je ne trouve pas comment faire.
    Je suppose qu’on doit utiliser la propriété Item de la collection lignes ou la méthode CopyTo mais je ne sui pas fichu d’y arriver et je ne dispose d’aucun exemple de code agissant de la sorte.

    Mon problème vaut entre lignes différentes de la DatagRidView (par exemple affecter à la ligne 5, le contenu de la ligne 10) ou entre lignes d’un tableau et de la DataGridView et ce, dans les deux sens. Récupérer ou affecter des lignes ou des blocs.
    Je rencontre le même problème pour le presse papier : je sais y copier des lignes mais je ne sais pas coller en bloc des lignes dans la grille, sans tout décortiquer case par case.

    Dernier élément : il ne s’agit pas d’une grille liée à une base de données.

    Enfin, je sollicite votre indulgence pour 3 raisons :
    1- je débute en VB Net
    2- je ne suis plus de toute première fraîcheur car je suis plus près de 60 ans que de 50…
    3- dans la doc en ligne, j’ai l’impression de chercher une aiguille dans une meule de foin…

    Donc si vous pouvez me donner quelques exemple de code pouvant m’aider dans ma récupération d’une ligne entière vers un tableau et inversement, je vous en serai reconnaissant et je vous en remercie d’avance.

    Philippe

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Au vue de ce que je lis, j'en déduit que tu n'utilises pas le .datasource du datagridview.

    Pour te simplifier la vie, je te conseille de ne pas alimenter "à la main" les cellules mais de passer par une datatable que tu positionneras comme datasource de ton datagridview.

    Ca te permettra facilement de récupérer une DataRow avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CType(Me.Rows(e.RowIndex)..DataBoundItem, DataRow)
    Bon courage !
    Cdt.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Merci de ta réponse qui a défaut de m’éclairer totalement me suggère un moyen supplémentaire de contourner ma difficulté.

    Ma curiosité n’en est pas pour autant satisfaite.

    Si je prends une DGV de 4 colonnes appelée MaGrille

    Je peux ajouter autant de lignes nouvelles que je veux, soit à la fin par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaGrille.Rows.Add(New String() {"case1", "case2", "3", "4"})
    Soit au niveau de la ligne x par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaGrille.Rows.Insert (x, New String() {"case1", "case2", "3", "4"})
    Je me dis qu’il doit bien y avoir un moyen pour pouvoir forcer une ligne non vide contenant déjà des valeurs {"A", "B", "C", "D"} par exemple à prendre d’autres valeurs avec une seule instruction sans passer par l’affectation case par case

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MaGrille.Rows(x).Cells(0).Value = "case1"
    MaGrille.Rows(x).Cells(1).Value = "case2"
    MaGrille.Rows(x).Cells(2).Value = "3"
    MaGrille.Rows(x).Cells(3).Value = "4"
    Et bien entendu, la question de la manip inverse se pose :

    Comment récupérer une ligne à la fois sans passer par le contenu individuel de chaque cellule de la ligne ?

    C’était un peu ma question mais j'avoue que dans la mesure où il existe maintes façons de faire autrement, je survivrai même en n'ayant pas tout à fait la réponse attendue. ;-)

    Cordialement

    Philippe

  4. #4
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Bon, au risque de me répéter, je te conseille de passer par une datatable pour alimenter le datagridview.

    Je ne connais pas de méthode permettant de récupérer une ligne compléte du dgv si celui-ci n'a pas de datasource. Et ce type de méthode me semble douteuse sachant que le dgv n'est qu'un composant d'affichage.

    Cdt.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Bonsoir,

    Je débute en VB Net et je ne maîtrise pas la liaison des données. C’est un peu pour ça que je ne me suis pas lancé dans un dgv lié à une datatable, mais pour être moins idiot, je vais m’y mettre… c’est promis.

    Il n’empêche que quoique composant d’affichage, le dgv est aussi un contrôle de saisie. Comme il conserve des données dans ses cellules, rien ne me semble interdire (mais il y a peut être des motifs que j'ignore) de s’en servir aussi comme d’un tableau de données au format texte, sans recourir à une datatable.

    Pour prendre l’exemple le plus simple, si je veux utiliser un dgv à 3 colonnes pour saisir une série de longueurs et de largeurs, puis afficher les surfaces dans la troisième colonne, sauf possibilités de programmation plus étendues offerte par la liaison, l’intérêt de lier une table ne me semble pas évident. Ceci d’autant plus que seules les donnée rentrées dans les colonnes longueurs et largeurs seraient à sauvegarder en fin de traitement, et encore, sous forme numérique et pas forcément sous forme de chaîne formatée comme dans une table. Les surfaces, elles peuvent être recalculées et ne méritent pas d’occuper de l’espace disque ou de la mémoire.

    Bon, tu auras deviné que je suis un peu têtu et que j’aime bien me justifier… j’arrête de te prendre la tête et je te remercie de tes réponses qui m’incitent à apprendre un peu plus (là, je ne suis pas têtu, je connais l’immensité de mes lacunes…)

    A+

    Ph
    ____________________________________________________
    PS. Pour la balise code, autant pour moi, je n'avais même pas vu qu'elle existait.

  6. #6
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Il faut comprendre que la datatable n'est pas forcément issue d'une base de donnée.

    Une exemple a 20 cts pour illustrer :
    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
    30
     
    Public Class Form5
     
        Dim dt As New DataTable
     
        Private Sub Form5_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     
            dt.Columns.Add("Col1")
            dt.Columns.Add("Col2")
            dt.Columns.Add("Col3")
            dt.Rows.Add(10, 20, 200)
            dt.Rows.Add(30, 40, 1200)
            dt.Rows.Add(5, 2, 10)
            dt.Rows.Add(7, 3, 21)
     
            AddHandler dt.ColumnChanged, _
             New DataColumnChangeEventHandler(AddressOf ColChange)
     
            Me.DataGridView1.DataSource = dt
     
        End Sub
     
        Private Sub ColChange(ByVal sender As Object, _
        ByVal e As DataColumnChangeEventArgs)
            If e.Column.ColumnName = "Col1" Or e.Column.ColumnName = "Col2" Then
                e.Row(2) = CType(e.Row(0), Integer) * CType(e.Row(1), Integer)
            End If
        End Sub
     
    End Class
    C'est quand même plus sexy à manipuler la datatable je trouve !

    Hésites pas si tu bloques vraiment (en MP car apparemment je suis bien le seul que ça intéresse !)

    Cdt.

  7. #7
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    dans certains cas, ajouter les données dans un datatable ou dans un datagridview directement ne change rien
    vu qu'au final le .datasource fait la meme chose ...

    et je ne vois pas en quoi c'est plus sexy de remplir un datatable, ca fait le meme code
    sur le dgv on peut aussi faire .columns.Add et .rows.add(values)

  8. #8
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Le gros avantage du datatable pour moi c'est de décabler complétement des règles de cohérence entre les données d'une même ligne en encapsulant tout ça dans un objet qui met à dispo des "readers".

    Tu peux ainsi afficher tes data dans n'importe quel composant graphique sans devoir implémenter le respect de ces règles dans le composant.

    Mais bon, dans l'exemple, c'est vrai que l'intérêt reste limité !!!

    Aprés, chacun trouvera midi à sa porte.

    Cdt.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Merci de vos réponses qui m'ont incité à m'intéresser à la liaison des données.
    Cela n'a pas répondu totalement à ma question initiale, mais peut-être que la méthode recherchée n'existe pas en VB...
    Dans le doute, je ne sais pas s'il faut clore par "Résolu" ou non (?)

  10. #10
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    si tu peux nous reformuler la question en explicitant le but
    car on peut effectivement avoir toutes les valeurs d'une ligne dans un seul objet

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Eh bien par exemple je voudrais pouvoir échanger le contenu de deux lignes d'un dgv sans devoir traiter cellule par cellule.

    Placer par exemple la ligne 2 dans une variable, mettre à la place, en ligne 2, le contenu de la ligne 4 et puis mettre en ligne 4 l'ancienne ligne 2 stockée dans la variable.

    Idem pour des groupes de lignes, si c'est jouable. Par exemple mettre en 2, 3, 4, le contenu de 3 lignes stockées ailleurs.

    Bien entendu, je peux facilement faire toutes ces manip en traitant cellule par cellule, mais je me demandais s'il n'existait pas une méthode permettant de traiter ligne par ligne.

    Voilà, c'était tout. Mais de toute façon, il me reste une infinité de choses à apprendre et à comprendre en VB Net alors je ne suis pas traumatisé de ne pas savoir comment faire quelque chose que j'imagine possible...

  12. #12
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Vous allez me trouver pénible avec mon datasource, mais dans la mesure ou la propriété rows(n) d'un datagridview est en readonly, je ne vois pas trop comment en une ou deux lignes on peut switcher 2 lignes sans jouer sur la source de donnée du dgv.

    Sinon je ne vois pas autre chose que la copie bestiale cellule par cellule.

    (A noter que l'idée du .clone sur les rows ne marche pas car seul les propriétés de la row sont copiées --> pas celles des cellules).

    Cdt.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Non seulement je ne te trouve pas pénible avec ta datasource mais au fur et à mesure de mes recherches, de mes essais, et de mes échanges j'en arrive à la conclusion que tu avais raison depuis le début.

    Reste une unique question, est-ce que pour les rares occasions ou j'aurais besoin de coller des lignes à la place d'autres, je gagnerai en temps d'exécution en utilisant une datasource ou bien vaut-il mieux pratiquer la copie "bestiale" (comme tu la décris) cellule par cellule ?
    Pour ne pas avoir à utiliser de datatable, je pourrais aussi insérer ma ligne entière et supprimer l'ancienne... mais je suppose que même s'il existe des méthodes insert et remove ce genre de manip qui décale tout vers le haut pour insérer la ligne et puis qui redécale tout vers le bas pour effacer l'ancienne ne doit pas être un modèle en terme de rapidité...

    Quoi qu'il en soit, si la liaison avec une datasource est plus efficace et pas plus gourmande en ressources, je vais reprendre mon code et en utiliser une.

    A+ et en tout cas merci de tes réponses.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    108
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 108
    Points : 57
    Points
    57
    Par défaut
    Il assure Olsimare

  15. #15
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Comme la datatable (et son contenu) est stockée en mémoire, le coût de manipulation de ces lignes est négligeable. Donc j'opte plutôt pour des manipulations sur des datatables positionnées comme datasource du dgv.

    En plus ça t'ouvres plus de possibilité car la manipulation des datatable/dataview/datarow ... me semble bien plus poussé que la manipulation sur les rox ou column du dgv.
    Par exemple, quand tu voudras mettre en place des filtres sur ton dgv (souvent on en a besoin à la fin), tu pourras définir des dataview (sur la datatable) comme source du dgv et ça se fera tout seul.

    Mais ça n'est jamais que mon avis !

    PS Pour Bonilla : faut pas exagérer non plus !

    Cdt.

Discussions similaires

  1. Supprimer une ligne entière avec condition?!
    Par ChicoXavier dans le forum Général Python
    Réponses: 2
    Dernier message: 08/04/2013, 19h53
  2. Réponses: 3
    Dernier message: 27/06/2011, 08h35
  3. Copier/coller d'une ligne entière avec petits détails
    Par alexg33 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/07/2010, 16h00
  4. Réponses: 10
    Dernier message: 06/05/2010, 20h51
  5. Comment manipuler des lignes RichEdit avec attributs
    Par Nicolas Coolman dans le forum Débuter
    Réponses: 4
    Dernier message: 23/03/2009, 22h53

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