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 :

Datagridview mise en forme


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut Datagridview mise en forme
    Bonjour,
    Avant de me lancer dans du code de débutant averti, j'aimerais savoir si ce que je souhaite est déjà possible de base.

    J'ai un DGV, avec beaucoup de cellules, je propose un moyen de "remplir" les cellules par une série de données (6 variables peuvent être rempli pour chaque cellule). J'utilise un bête morceau de texte composé de "-" et de lettre majuscules pour montrer a l'utilisateurs les variables remplis dans chaque cellules. Par exemple, l'utilisateur aura rempli la première donnée et la troisième : "T-M----" sera affiché dans la cellule.

    C'est bien marrant tout ça, mais pas très détaillé, pas bien pratique. J'aurais voulu permettre à l'utilisateur de voir au coup d'oeil ce qu'il a mis exactement. Pour cela j'ai regardé les formes que peuvent prendre une cellule ... il manque le plus proche de ce que je souhaite : la listbox, et il manque aussi le dgv. L'idée serait d'avoir pour chaque cellule un petit tableau avec toute les variables présenté.

    Dans le pire des cas, j'aurais la possibilité de coder une petite fonction permettant de remplir chaque ligne dans un texte préalablement écrit avec des sauts de ligne, mais je trouve ça lourd. J'aurais aussi le moyen de passer par un hover (je sais pas si c'est bien possible mais ça ne m'étonnerait pas, après si c'est facile à mettre en place, c'est une autre question) sur chaque cellule, si on garde la souris plus de Xseconde, un petit rectangle reprenant mes variables s'affiche, ayant l'avantage d'être lisible quelque soit la taille de mes cellules (a terme, 384 cellules elles seront pas bien grandes pour tenir sur un écran de mon boulot)

    Je parcours vb depuis plus d'un an maintenant, et j'ai surtout appris qu'il y a souvent un moyen déjà prévu pour ce que je prévois de faire, je préfère donc poser la question avant désormais, ça m'évite de m'embourber petit à petit dans un code rempli de doublons ^^' mon niveau en codage et surtout en structuration ne le permettrait pas.

  2. #2
    Expert confirmé 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
    Par défaut
    L'idée serait d'avoir pour chaque cellule un petit tableau avec toute les variables présenté.
    Je vois 2 possibilités :
    • assez simple : utiliser l'event CellPainting pour tracer à ta convenance le contenu de e.graphics comme dans une picturebox (avec des DrawString, FillRectangle, DrawLine, ...)
    • plus pro : Gérer une colonne contenant des UserControl : voir http://msdn.microsoft.com/en-us/library/7tas5c80.aspx


    J'aurais aussi le moyen de passer par un hover (je sais pas si c'est bien possible mais ça ne m'étonnerait pas, après si c'est facile à mettre en place, c'est une autre question) sur chaque cellule
    Trop bidouille (beaucoup de cas à gérer pour le positionnement et les conditions d'affichage/effacementdu rectangle).

    On peut envisager de réserver un panel en deghors du DataGridView pour afficher les "détails" de la cellule quand on clique dessus.

  3. #3
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    La première solution me semble un peu farfelu, l'idée serait de combiner la formation d'un tableau par dessin et un texte avec des retours chariot ?

    La deuxième solution m'intrigue, l'idée serait au final de créer un control, ça me donne un peu le vertige sur le papier, étant donné qu'un control englobe beaucoup de chose, mais au final ça me semble être la solution la plus propre et qui me permettra d'être au plus proche de ce que je souhaite faire.

    L'idée alternative au hover semble intéressante, elle permet la même chose mais ça se code bien plus simplement en effet. Merci ^^

    Je tente quelques petites choses et j'apporterais ma solution si elle fonctionne, sans quoi faudra que je vous embête encore un peu.

    edit : j'ai oublié la pièce jointe

    Nom : Capture.PNG
Affichages : 557
Taille : 17,4 Ko

  4. #4
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    Je reviens à la charge, ça y est je suis perdu @.@ Je vais dégainer mes lunettes et ma perf de caféine, mais malgré ça je ne pense pas créer quoi que ce soit de viable tout seul sans tuto ni aide plus poussé que le simple exemple.

    Vla où j'en suis, ou du moins la classe qui me pose problème (le code est généré suite à l'implements, je pense qu'il faut le compléter mais ... :/):

    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
    Public Class listboxeditingcontrol
        Inherits ListBox
        Implements IDataGridViewEditingControl
     
        Public Sub ApplyCellStyleToEditingControl(dataGridViewCellStyle As System.Windows.Forms.DataGridViewCellStyle) Implements System.Windows.Forms.IDataGridViewEditingControl.ApplyCellStyleToEditingControl
     
        End Sub
     
        Public Property EditingControlDataGridView As System.Windows.Forms.DataGridView Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlDataGridView
            Get
     
            End Get
            Set(value As System.Windows.Forms.DataGridView)
     
            End Set
        End Property
     
        Public Property EditingControlFormattedValue As Object Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlFormattedValue
            Get
     
            End Get
            Set(value As Object)
     
            End Set
        End Property
     
        Public Property EditingControlRowIndex As Integer Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlRowIndex
            Get
     
            End Get
            Set(value As Integer)
     
            End Set
        End Property
     
        Public Property EditingControlValueChanged As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlValueChanged
            Get
     
            End Get
            Set(value As Boolean)
     
            End Set
        End Property
     
        Public Function EditingControlWantsInputKey(keyData As System.Windows.Forms.Keys, dataGridViewWantsInputKey As Boolean) As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.EditingControlWantsInputKey
     
        End Function
     
        Public ReadOnly Property EditingPanelCursor As System.Windows.Forms.Cursor Implements System.Windows.Forms.IDataGridViewEditingControl.EditingPanelCursor
            Get
     
            End Get
        End Property
     
        Public Function GetEditingControlFormattedValue(context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object Implements System.Windows.Forms.IDataGridViewEditingControl.GetEditingControlFormattedValue
     
        End Function
     
        Public Sub PrepareEditingControlForEdit(selectAll As Boolean) Implements System.Windows.Forms.IDataGridViewEditingControl.PrepareEditingControlForEdit
     
        End Sub
     
        Public ReadOnly Property RepositionEditingControlOnValueChange As Boolean Implements System.Windows.Forms.IDataGridViewEditingControl.RepositionEditingControlOnValueChange
            Get
     
            End Get
        End Property
    End Class

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,

    Vu que tu as de la place en bas, utilise 2 panels 'comme suggérait Graffito'.
    Dans le premier tu met les info de la cellule sélectionnée, et dans le deuxième les info de la cellule survolé par la souris (CellMouseEnter). Je l'avais fait avec un tablelayoutpanel.
    C'est simple et facile à mettre en oeuvre. Bien visuel pour l'utilisateur.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  6. #6
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    Pour le cas où j'aurais 384 cellules, j'utiliserais cette solution en effet, mais pour le cas de mes 96 cellules, j'aimerais garder le confort de voir tout ce qu'il y a dans chaque cellule. Car même si j'ai une coloration par variable (on peut demander a avoir un affichage : une couleur = une entité de la variable), c'est quand même plus confortable de voir ce qu'on introduit et où.

    Et je tente de faire un control listbox pour mon dgv mais je suis perdu ^^'

  7. #7
    Expert confirmé 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
    Par défaut
    La première solution me semble un peu farfelu, l'idée serait de combiner la formation d'un tableau par dessin et un texte avec des retours chariot ?
    C'est pourtant la plus simple et on l'utilise fréquement pour combiner 2 polices ou 2 couleurs dans la même cellule.

  8. #8
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    Dans ce cas je l'aurais mal compris, excuse moi : si deux formats de texte, alors plusieurs textbox ? Dans une cellule ?

  9. #9
    Expert confirmé 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
    Par défaut
    si deux formats de texte, alors plusieurs textbox ? Dans une cellule ?
    Non, c'est pour l'affichage seulement.

    En pensant que tu voulais seulement faire de l'affichage, j'ai peut-être mal interprété ta demande :
    ... un moyen de "remplir" les cellules ...
    .. la listbox (Pas de saisie possible dans une ListBox) ...
    ... le moyen de passer par un hover ...
    Si on veut faire de la saisie dans les cellules du DatagridView, c'est un autre problème et la solution du "CellPainting" ne peut évidement pas convenir ou doit être combinée avec un event type click pour afficher un panel de saisie.

  10. #10
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    J'ai oublié de préciser ^^'

    Le premier cas marcherais, mais comme dit, j'ai 96 puits, à changer ça commence a faire beaucoup, plus qu'une question de flemme (un peu quand même) j'ai appris à toujours trouver un moyen de faire les choses simplement, au cas où le nombre d'itération grandis.

    Ensuite concernant le remplissage : en fait, le dgv chez n'est qu'un affichage, une schématisation de ce que l'utilisateur demande, ainsi qu'un moyen de sélection. Pour "remplir" une cellule, l'utilisateur doit la sélectionner, appuyer sur un bouton qui ouvre une nouvelle form qui s'occupe de récupérer les données textes. à la fermeture de ce nouveau form, tout est actualisé, affichant les données qui viennent d'être introduite.

    Je remarque enfin, que l'idée de créer un control lié à deux controls est une bonne expérience, j'ai envie de savoir le faire pour la suite, ça me sera forcément utile, ça m'éviterais de vous embêter plus tard ^^
    Si ça ne vous plait pas, pas de soucis, je suis conscient de la difficulté de ma demande et de votre gentillesse.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    pas lu, donc je ne sais pas si tu as déjà ta réponse

    sinon y a pas longtemps j'ai fait des classes spécifiques pour des colonnes (image + texte + modification spéciale par fenetre de sélection) et j'ai pu voir qu'on pouvait faire ce qu'on voulait avec le dgv
    moi dans une colonne que je n'affiche pas j'ai mis une instance de classe (pour la retrouver facilement en fonction de la ligne)
    et j'ai créé des types de colonnes
    au final on se retrouve avec un overrides de onpaint et on fait ce qu'on veut
    ca peut sembler bizare de dessiner les bordures, le texte, et tout ce qu'on veut en plus même si c'est compliqué, mais au final c'est ce que fait le datagridview de base, des drawrectangles et des drawstring/drawimage
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    Bonjour,
    Ton idée serait alors de faire en sorte que la colonne (ou la cellule) soit un ensemble de lignes et de petit label ? une sorte de super contrôle avec plusieurs contrôles dedans ? Dans l'idée ça me semble plus simple que de faire une cellule-listbox (toujours pas réussi à le faire, il semblerait qu'il faille remplir tout un tas de fonction qui coordonne les données, et je suis même pas sûr d'avoir réussi à créer au moins l'affichage....)

    Je m'y penche (un peu démotivé malgré tout ^^' mais c'est lundi, soyons positif). Merci pour votre aide.

  13. #13
    Membre Expert Avatar de _Ez3kiel
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2013
    Messages
    836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2013
    Messages : 836
    Par défaut
    L'exemple est pour un DateTimePicker mais tu peux tenter de l'adapter pour une Listbox (ce que tu as déjà un peu fait en implémentant IDataGridViewEditingControl) : How to: Host Controls in Windows Forms DataGridView Cells

  14. #14
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    Le soucis justement c'est que passé cette étape, je pêche complet en fait, je ne sais pas ce que je dois faire. Si bien compris, il me faut reconstruire les méthodes qu'utilisent listbox, et j’avoue que même en tentant de copier la méthode utilisé dans l'exemple que tu m'as renvoyé, j'arrive pas à tout saisir, les contrôles sont différent, et j'ai l'impression que la listbox n'est pas la forme la plus simple (dans le cas du calendrier, il ne fait que reprendre la value de la cellule, moi la value se transforme en value(), et il ne semble pas l'accepter.

  15. #15
    Membre éclairé Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Par défaut
    Nouveauté (minimum, je suis partagé avec mes activités de technicien, j'ai eu trop le temps de me plonger dans le code). J'arrive à créer la colonne sans message d'erreur, autrement dit il semble accepter que datagridcell.value soit un tableau, par contre sur la mise en forme, il doit manquer quelque chose, parce que quand j'essaye de créer une ligne, et donc d'avoir une cellule, il passe carrément, sans erreur ni rien, il met fin à la procédure. Encore une fois la partie EditingControl (code plus haut, tout moche tout autocréé par vb), je ne l'ai pas rempli, ça doit sans doute venir de là, mais j'ai beau réfléchir, rien ne vient de convenable à l'esprit.
    Je n'ai testé que cette approche, je suis encore à l'étape google pour "dessiner" mes cellules.

Discussions similaires

  1. DataGridView - Lenteur de mise en forme
    Par Aeronia dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/02/2012, 12h42
  2. mise en forme du texte d'un datagridview
    Par ismababa dans le forum C#
    Réponses: 0
    Dernier message: 07/02/2011, 13h42
  3. Mise en forme DataGridView
    Par gls80 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 10/09/2010, 10h04
  4. Mise en forme DataGridView
    Par jemmass dans le forum Windows Forms
    Réponses: 0
    Dernier message: 09/10/2009, 17h47
  5. Mise en forme d'une DataGridview
    Par rdh123 dans le forum C#
    Réponses: 1
    Dernier message: 14/11/2008, 10h41

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