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 :

vb.net - Split/merge des headers datagridview


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Par défaut vb.net - Split/merge des headers datagridview
    Bonjour,

    Je souhaite pouvoir afficher dans un datagridview des headers qui puissent se spliter sur plusieurs colonnes :

    | Jan | Feb | Mar |
    |S1|S2|S1|S2 |S1|S2 |

    J'ai trouvé cette méthode :

    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
    Public Class Form1
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            With DataGridView1
                .Columns.Add("JanWin", "Win")
                .Columns.Add("JanLoss", "Loss")
                .Columns.Add("FebWin", "Win")
                .Columns.Add("FebLoss", "Loss")
                .Columns.Add("MarWin", "Win")
                .Columns.Add("MarLoss", "Loss")
                .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
                .ColumnHeadersHeight = DataGridView1.ColumnHeadersHeight * 2
            End With
        End Sub
     
        Private Sub DataGridView1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DataGridView1.Paint
     
            Dim Monthes() As String = {"Jan", "Feb", "Mar"}
            For A As Int32 = 0 To 5
     
                Dim Rect As Rectangle = DataGridView1.GetCellDisplayRectangle(A, -1, True)
     
                Rect.X += 1
                Rect.Y += 1
     
                Rect.Width = Rect.Width * 2 - 2
     
                Rect.Height = Rect.Height / 2 - 2
     
                e.Graphics.FillRectangle(New SolidBrush(DataGridView1.ColumnHeadersDefaultCellStyle.BackColor), Rect)
     
                Dim Format As New StringFormat()
                Format.Alignment = StringAlignment.Center
                Format.LineAlignment = StringAlignment.Center
     
                e.Graphics.DrawString(Monthes(A / 2), DataGridView1.ColumnHeadersDefaultCellStyle.Font, _
                New SolidBrush(DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor), Rect, Format)
     
                A += 1
            Next
     
        End Sub
    Cela fonctionne, le problème vient du repaint lors du scroll horizontal... les rectangles créés sont hachés.

    Comment faire pour éviter cela ?
    Cette méthode pour splitter artificiellement est-elle la bonne ?

    Merci de vos réponses.
    Alexandre

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    essaye de créer une classe héritant de datagridviewcolumn
    et tu mets ton texte de dessin dans l'overrides de la sub qui dessine (onpaint ou draw_quelquechose)
    et donc tu instancies ce type de colonne avant de les adder à ton dgv
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Par défaut
    Salut,

    Merci pour ta réponse, mais je n'y arrive pas.
    Il n'y a pas d'événement paint pour la class datagridviewcolumn.

    J'ai donc testé ca :

    Sur mon formulaire :

    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
    Public Class Form1
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Dim MyCol As New MyDGVColumn
            With DataGridView1
                .Columns.Add(MyCol.Name, "Win")
                .Columns.Add(MyCol.Name, "Loss")
                .Columns.Add(MyCol.Name, "Win")
                .Columns.Add(MyCol.Name, "Loss")
                .Columns.Add(MyCol.Name, "Win")
                .Columns.Add(MyCol.Name, "Loss")
                .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
                .ColumnHeadersHeight = DataGridView1.ColumnHeadersHeight * 2
     
            End With
        End Sub
    Dans une Class :

    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
    Public Class MyDGVColumn
        Inherits DataGridViewTextBoxColumn
     
        Public Sub New()
            MyBase.HeaderCell = New MyHeadCell
        End Sub
     
    End Class
     
    Public Class MyHeadCell
        Inherits DataGridViewColumnHeaderCell
     
        Public Sub New()
     
        End Sub
     
        Protected Overrides Sub Paint(ByVal graphics As System.Drawing.Graphics, ByVal clipBounds As System.Drawing.Rectangle, _
            ByVal cellBounds As System.Drawing.Rectangle, ByVal rowIndex As Integer, ByVal dataGridViewElementState As System.Windows.Forms.DataGridViewElementStates, _
            ByVal value As Object, ByVal formattedValue As Object, ByVal errorText As String, ByVal cellStyle As System.Windows.Forms.DataGridViewCellStyle, _
            ByVal advancedBorderStyle As System.Windows.Forms.DataGridViewAdvancedBorderStyle, ByVal paintParts As System.Windows.Forms.DataGridViewPaintParts)
            MyBase.Paint(graphics, clipBounds, cellBounds, rowIndex, dataGridViewElementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts)
     
            Dim Monthes() As String = {"Jan", "Feb", "Mar"}
            For A As Int32 = 0 To 5
     
                Dim Rect As Rectangle = cellBounds
     
                Rect.X += 1
                Rect.Y += 1
     
                Rect.Width = Rect.Width * 2 - 2
     
                Rect.Height = Rect.Height / 2 - 2
     
                graphics.FillRectangle(Brushes.Salmon, Rect)
     
                Dim Format As New StringFormat()
                Format.Alignment = StringAlignment.Center
                Format.LineAlignment = StringAlignment.Center
     
                graphics.DrawString(Monthes(A / 2), cellStyle.Font, Brushes.Purple, Rect, Format)
     
                A += 1
            Next
        End Sub
     
    End Class
    Mais l'événément Paint n'est pas levé...

    Merci en tous cas.
    Alexandre

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    il y a une sub overridable nommée Paint dans DataGridViewColumnHeaderCell

    c'est là qu'il faut tenter


    et ensuite tu instancies une colonne normale, et tu lui donnes ca cellule de header via

    macolonne.HeaderCell = New maclasseheadercell
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    306
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 306
    Par défaut
    Mais.. c'est exactement ce que je fais dans le code précédent, non ?

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 197
    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 197
    Par défaut
    ah oui désolé, j'avais mal vu

    c'est pourtant ce que j'ai fait pour pouvoir mettre une image dans une entete de colonne et moi ca marche ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/07/2014, 14h06
  2. Réponses: 2
    Dernier message: 01/04/2010, 09h24
  3. vb.net - Split/merge des headers datagridview
    Par House MD dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/09/2009, 10h19
  4. [VB.NET] Datagrid : Modifier les headers des colones
    Par burnedsoul dans le forum VB.NET
    Réponses: 9
    Dernier message: 05/11/2005, 11h29
  5. [VB.NET][ADO]Fusionner des dataTables
    Par neo.51 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 30/07/2005, 00h22

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