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 :

Comment placer un tableau de données dans 1 cellule de Datagridview ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Par défaut Comment placer un tableau de données dans 1 cellule de Datagridview ?
    Bonjour,

    Je dois, dans un projet, charger dans un Datagridview des données récupérées sur un site Web

    En gros cela donne : numero / date / nom / texte / image / lien correspondant à l'objet représenté en image et dont le nom est en texte
    Par exemple :

    2188 17/12/2019 Dédé Un beau cageot de melons [image] [https:\\....]
    Jusque là tout va bien...
    Sauf s'il y a 2 (ou plus) objets dans le même numéro :

    2188 17/12/2019 Dédé Un beau cageot de melons [image] [https:\\....]
    Et un autre cageot de courgettes [image2] [https:\\.2..]
    1ere Solution venue à mon esprit : faire une ligne par text/image/lien ... mais comme je n'ai pas trouvé le moyen de supprimer les bords horizontaux entre deux lignes... bof
    D'ailleurs si quelqu'un sait comment faire, je suis preneur (cela me simplifierait sans doute la vie !)

    2ème Solution, plus "hard" : placer un tableau texte dans la cellule texte, un tableau image dans la cellule image et ... pareil pour les liens

    Quelqu'un sait il comment faire cela en VBNet ?
    J'ai cherché sur le Web et, à part les classiques Image, Bouton, Textbox, ... (et j'en passe) je n'ai pas trouvé comment placer un tableau dans une cellule

    J'ai bien trouvé un exemple de création d'une classe spécifique de DataGridViewCell mais c'était en c# et je n'ai pas réussi à la transposer en VBNet...

    Si quelqu'un peut m'aider...
    Merci

    PS: je suis en VB2013 Express si cela doit changer quelque chose...

    Merci Winjerome pour les QUOTE !

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Par défaut Suite....
    Bonjour,

    Merci pour vos réponses... on se sent aidé.

    Bon, j'ai réussi à "regrouper" (en apparence en tout cas) les diverses lignes pour n'en faire apparaitre qu'une seule.

    Seul petit problème, comme j'ai une image dans mon avant dernière colonne, si je veux qu'on puisse voir ce qu'elle représente je dois lui donner une certaine hauteur.
    Dans ce cas évidemment la ligne prend cette même hauteur... et je me retrouve avec un bouton (dernière colonne, pour lancer le lien html) de la taille de l'image !

    Quelqu'un a-t-il, SVP, une idée pour donner à ce bouton une taille normale (surtout en hauteur) malgré la hauteur de la ligne ?
    Autrement dit : modifier la hauteur d'un objet contenu dans une cellule.

    Merci de vos réponses,

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Citation Envoyé par Delthi59 Voir le message
    Bonjour,

    Merci pour vos réponses... on se sent aidé.
    Petit rappel :
    Nous ne sommes pas des employés du site mais des personnes qui consacrons un peu de notre temps à aider de manière volontaire d'autres personnes de bonnes volontés.
    Nous ne sommes pas à votre service et le fait que nous passions notre DIMANCHE comme nous l'entendons ne justifie en rien ce genre de commentaire.

    Notez que malgré votre manque honteux de respect envers notre communauté, je vais quand même prendre le temps de vous répondre :
    Le DataGridView est prévu pour afficher des données tabulaires.
    S'il faut un affichage particulier (comme plusieurs lignes par enregistrement), je vous suggère de créer un UserCrontrol dédié et pour chaque ligne, créer une instance de ce UserControl que vous ajouterez à un FlowLayoutPanel.

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2014
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2014
    Messages : 40
    Par défaut
    Citation Envoyé par popo Voir le message
    Petit rappel :
    Nous ne sommes pas à votre service et le fait que nous passions notre DIMANCHE comme nous l'entendons ne justifie en rien ce genre de commentaire.

    Notez que malgré votre manque honteux de respect envers notre communauté, je vais quand même prendre le temps de vous répondre :
    Notez que je n'avais formulé aucune critique, faisant simplement état de mon regret de ne pas avoir eu un simple "On va voir" ce qui aurait pu se faire pour me rassurer et sans obérer vos activités dominicales.
    Sans doute manquait-il une motivation que mon "manque honteux de respect" a su vous donner.
    Je ne pense pas avoir manqué de respect en énonçant une simple constatation.

    Merci en tout cas de votre réponse (qui ne m'avance guère puisque j'ai expliqué dans ma demande ne pas savoir comment faire ce UserControl dédié dans mon message) et du temps qu'il vous a pris

    Avec toute ma considération.

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Citation Envoyé par Delthi59 Voir le message
    Notez que je n'avais formulé aucune critique, faisant simplement état de mon regret de ne pas avoir eu un simple "On va voir" ce qui aurait pu se faire pour me rassurer et sans obérer vos activités dominicales.
    Un simple "on va voir" n'est pas une réponse qui va t'aider à résoudre ton problème.
    Il s'agit donc d'un post inutile qui est contraire aux règles du forum.


    Citation Envoyé par Delthi59 Voir le message
    Merci en tout cas de votre réponse (qui ne m'avance guère puisque j'ai expliqué dans ma demande ne pas savoir comment faire ce UserControl dédié dans mon message) et du temps qu'il vous a pris.
    Avec toute ma considération
    Aucun de tes messages n'évoque de près ou de loin un UserControl.
    Tu as parlé de jouer avec les bordure (donc directement sur la grille)
    Tu as parler de mettre un tableau dans un tableau (encore une fois, il n'est question que de grilles)
    Tu as parlé de regrouper "en apparence" tes diverses lignes (le "en apparence" indique clairement qu'il n'y a pas de UserControl mais que tu tente encore de faire du bricolage avec ta grille)

    La solution que je t'ai proposé est JUSTEMENT d'abandonner la grille qui n'est pas faite pour ça.
    Si tu avais pris la peine de rechercher "UserControl" sur google (où sur ce site), tu aurais trouvé bon nombres de tutos dont celui ci :
    https://morpheus.developpez.com/usercontrols/

    Je t'ai aussi parlé de placer ces instances de UserControl dans un FLowLayoutPanel
    Idem, une recherche google t'aurais donné quelques exemples dont celui-ci :
    https://stackoverrun.com/fr/q/3571232

    PS : Le sarcasme est également une forme de non respect.

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Tout en souscrivant entièrement aux réponses faites par pop , et particulièrement au fait de rappeler que nous sommes des bénévoles ,non rétribués par qui que ce soit,et entre autres fournir au moins un bout de code sur les tentatives faites ,ce que tu n'as même pas fait.

    Néanmoins ce que tu tentes de faire ici :
    Jusque là tout va bien...
    Sauf s'il y a 2 (ou plus) objets dans le même numéro :

    2188 17/12/2019 Dédé Un beau cageot de melons [image] [https:\\....]
    Et un autre cageot de courgettes [image2] [https:\\.2..]
    1ere Solution venue à mon esprit : faire une ligne par text/image/lien ... mais comme je n'ai pas trouvé le moyen de supprimer les bords horizontaux entre deux lignes... bof
    D'ailleurs si quelqu'un sait comment faire, je suis preneur (cela me simplifierait sans doute la vie !)
    est un "DataGridViewGrouping" ou Vue de DataGridView Groupée suivant colonne Numéro.

    Pour ce faire les events DataGridView1_CellFormatting & DataGridView1_CellPainting sont les outils appropriés ,en conjonction avec la fonction-clé IsRepeatedCellValue qui fait le boulot escompté .
    l'exemple code ci-dessous est une illustration claire et efficace de ce "grouping" des colonnes du dgv:
    -un Form, un ImageList(3 images) et un DataTable exemple.
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    Public Class Form3
        'gestion des colonnes  speciales : DataGridViewLinkColumn et DataGridViewButtonColum
        Enum ColumnName
            LinkColumn
            ButtonColumn
        End Enum
        Private yourTable As DataTable
        Private Sub Form3_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            yourTable = LoadTable()
            Me.DataGridView1.DataSource = yourTable
     
            'suppression des colonnes autogenererees
            Me.DataGridView1.Columns.Remove(ColumnName.ButtonColumn.ToString())
            Me.DataGridView1.Columns.Remove(ColumnName.LinkColumn.ToString())
            'leur remplacement par les  colonnes appropriées
            AddButtonColumn()
            AddLinkColumn()
        End Sub
        'datatable exemple
        Private Function LoadTable() As DataTable
            Dim tbl As New DataTable
     
            tbl.Columns.AddRange(
                New DataColumn() {
                    New DataColumn("Numero", GetType(Integer)),
                    New DataColumn("Text", GetType(String)),
                    New DataColumn("LinkColumn", GetType(String)),
                    New DataColumn("Image", GetType(Image)),
                    New DataColumn("ButtonColumn", GetType(String))
          })
            tbl.Rows.Add(New Object() {100, "item1", "https://www.developpez.net/forums/d2098368/dotnet/langages/vb-net/placer-tableau-donnees-1-cellule-datagridview/", ImageList1.Images(0), "valider"})
            tbl.Rows.Add(New Object() {100, "item1", "https://www.google.fr", ImageList1.Images(0), "valider"})
     
            tbl.Rows.Add(New Object() {200, "item2", "https://www.yahoo.fr", ImageList1.Images(1), "valider"})
     
            tbl.Rows.Add(New Object() {300, "item3", "https://www.google.fr", ImageList1.Images(2), "valider"})
            tbl.Rows.Add(New Object() {300, "item3", "https://www.developpez.net/forums/f486/dotnet/langages/vb-net/", ImageList1.Images(2), "valider"})
            tbl.Rows.Add(New Object() {300, "item3", "https://www.developpez.net/forums/d2098368/dotnet/langages/vb-net/placer-tableau-donnees-1-cellule-datagridview/", ImageList1.Images(2), "valider"})
     
     
     
            Return tbl
     
        End Function
        Private Sub AddLinkColumn()
     
            Dim lnk As New DataGridViewLinkColumn()
            With lnk
                .Name = ColumnName.LinkColumn.ToString()
                .HeaderText = ColumnName.LinkColumn.ToString()
                .DataPropertyName = ColumnName.LinkColumn.ToString()
                .ActiveLinkColor = Color.White
                .LinkBehavior = LinkBehavior.SystemDefault
                .LinkColor = Color.Blue
                .TrackVisitedState = True
                .VisitedLinkColor = Color.YellowGreen
            End With
            Me.DataGridView1.Columns.Add(lnk)
        End Sub
        Private Sub AddButtonColumn()
     
            Dim btn As New DataGridViewButtonColumn()
            With btn
                .Name = ColumnName.ButtonColumn.ToString()
                .HeaderText = ColumnName.ButtonColumn.ToString()
                .DataPropertyName = ColumnName.ButtonColumn.ToString()
            End With
            Me.DataGridView1.Columns.Add(btn)
        End Sub
        'les events CellFormatting & CellPainting
        Private Sub DataGridView1_CellFormatting(ByVal sender As System.Object, ByVal args As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
            ' First row always displays
     
            If (args.RowIndex = 0) Then Return
     
            If (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex)) Then
     
                args.Value = String.Empty
                args.FormattingApplied = True
     
            End If
        End Sub
     
        Private Sub DataGridView1_CellPainting(ByVal sender As Object, ByVal args As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
            args.AdvancedBorderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.None
            'Ignore column and row headers and first row
     
            If (args.RowIndex < 1 Or args.ColumnIndex < 0) Then Return
     
            If (IsRepeatedCellValue(args.RowIndex, args.ColumnIndex)) Then
     
                args.AdvancedBorderStyle.Top = DataGridViewAdvancedCellBorderStyle.None
            Else
                args.AdvancedBorderStyle.Top = Me.DataGridView1.AdvancedCellBorderStyle.Top
                args.AdvancedBorderStyle.Right = Me.DataGridView1.AdvancedCellBorderStyle.Right
                args.AdvancedBorderStyle.Bottom = Me.DataGridView1.AdvancedCellBorderStyle.Bottom
            End If
        End Sub
        'methode au coeur de ce custom formatting :grouping des columns
        Private Function IsRepeatedCellValue(ByVal RowIndex As Integer, ByVal colIndex As Integer) As Boolean
            If RowIndex = Me.DataGridView1.RowCount - 1 Then Return False 'saut nouvelle ligne 
     
            Dim currCell As DataGridViewCell = Me.DataGridView1.Rows(RowIndex).Cells(colIndex)
            Dim prevCell As DataGridViewCell = Me.DataGridView1.Rows(RowIndex - 1).Cells(colIndex)
     
            'gestion  cellule Bitmap
            If (TypeOf currCell.Value Is Bitmap) Then Return False 'gestion 
            'gestion de cellule nouvelle ligne
            If (TypeOf currCell.Value Is DBNull) Then Return False
     
            'gestion de la cellule de type DGVBoutonCell(une telle cellule comporte un contenu texte fixe et repetitif)
            If Me.DataGridView1.Columns(colIndex).Name = ColumnName.ButtonColumn.ToString() Then
                Return False
     
            End If
            'gestion des cellules de type DGVTextBoxCell (une telle cellule comporte un contenu texte fixe et repetitif)
            If (currCell.Value = prevCell.Value) Or
                (currCell.Value IsNot Nothing And prevCell.Value IsNot Nothing And
                    currCell.Value.ToString() = prevCell.Value.ToString()) Then
                Return True
            Else
                Return False
            End If
     
        End Function
     
     
    End Class
    Bon code...

Discussions similaires

  1. [MySQL] Comment faire pour récupérer les données dans ce tableau avec php ?
    Par selim07 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2017, 23h58
  2. [AC-2007] Comment puis-je enregistrer des données dans listview en tableau
    Par biancaioana dans le forum VBA Access
    Réponses: 7
    Dernier message: 21/08/2012, 20h16
  3. Placer n'importe quelles données dans une "cellule"
    Par Anduriel dans le forum MATLAB
    Réponses: 7
    Dernier message: 25/08/2011, 14h45
  4. Réponses: 2
    Dernier message: 22/04/2010, 11h13
  5. Réponses: 2
    Dernier message: 28/10/2005, 12h52

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