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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 182
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 182
    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
    Membre averti
    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
    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 Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 182
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 182
    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
    Membre averti
    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
    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 Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 182
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 182
    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.

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