none
Título de dos líneas en cabecera de DatagridView RRS feed

  • Pregunta

  • Hola a todos, buenos días:

    La pregunta es como insertar dos líneas de títulos en un datagridview. Eso antes en vb6 lo hacía con la propiedad .mergecells del control VsFlexgrid, que era el que utilizaba. He estado mirando que puede haber algún truco para realizarlo con el DatagridView, pero no comprendo como el control no tiene dicha posibilidad.

    Lo que preciso hacer es más o menos esto:

                             |                     DICIEMBRE 2012                |         DICIEMBRE 2011                |

    CONCEPTO         |                              |                               |                   |                             |

                             |             ORIGEN     |    APLICACIÓN         |   ORIGEN     |    APLICACIÓN       |   ...   

    Esto es lo que tendría que ir como título en en el Headers, pero no encuentro la manera de hacerlo.

    Bueno, muchas gracias a todos.

    Un cordial saludo.

    Gemma   

    miércoles, 4 de julio de 2012 6:28

Respuestas

  • Hola Sergio:

    Continúa el error en :

    DataGridViewCellPaintingEventHandler

    Indica que se trata de un tipo y que no se puede usar como expresión. No tengo ni idea de que se tiene que hacer.

    Bueno, vamos a ver si se nos ocurre algo para solucionarlo. Siento no tener idea de "C#".

    Atentamente.

    Gemma

    • Marcado como respuesta gemma_campillo miércoles, 4 de julio de 2012 9:18
    miércoles, 4 de julio de 2012 9:02

Todas las respuestas

  • Hola,

    la mala noticia es que directamente el DataGridView no contempla esa opción, aunque la buena noticia es que jugando un poco puedes conseguir el efecto deseado. Aquí te paso un código donde lo explican

    6. How do I show multi-layered column headers?


    Atentamente, Sergio.

    Blog
    Twitter

    miércoles, 4 de julio de 2012 7:50
  • Hola sergio, buenos días.

    Muchas gracias por tu ayuda, creo que si es eso lo que necesito. Lo he traducido del C al vb.net y solamente tengo un error que no se como arreglarlo. es por mi poca experiencia con el .net. El código lo adjunto, pero me da el error marcado en negrita: Me.dataGridView1.CellPainting  y Me.dataGridView1.Paint

    Public Event CellPainting(sender As Object, e As System.Windows.Forms.DataGridViewCellPaintingEventArgs)' es un evento y no se puede llamar directamente. Utilice la instrucción RaiseEvent para provocar un evento. 

     Private Sub DgvColumnHeaderMerge_Load(sender As Object, e As EventArgs)
    
            Me.DataGridView1.Columns.Add("JanWin", "Win")
    
            Me.dataGridView1.Columns.Add("JanLoss", "Loss")
    
            Me.dataGridView1.Columns.Add("FebWin", "Win")
    
            Me.dataGridView1.Columns.Add("FebLoss", "Loss")
    
            Me.dataGridView1.Columns.Add("MarWin", "Win")
    
            Me.dataGridView1.Columns.Add("MarLoss", "Loss")
    
            For j As Integer = 0 To Me.dataGridView1.ColumnCount - 1
    
                Me.dataGridView1.Columns(j).Width = 45
            Next
    
            Me.dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
    
            Me.dataGridView1.ColumnHeadersHeight = Me.dataGridView1.ColumnHeadersHeight * 2
    
            Me.DataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
    
            Me.dataGridView1.CellPainting += New DataGridViewCellPaintingEventHandler(AddressOf dataGridView1_CellPainting)
    
            Me.dataGridView1.Paint += New PaintEventHandler(AddressOf dataGridView1_Paint)
    
        End Sub
    
        Private Sub dataGridView1_Paint(sender As Object, e As PaintEventArgs)
    
            Dim monthes As String() = {"January", "February", "March"}
    
            Dim j As Integer = 0
            While j < 6
    
                'get the column header cell
    
                Dim r1 As Rectangle = Me.DataGridView1.GetCellDisplayRectangle(j, -1, True)
    
                r1.X += 1
    
                r1.Y += 1
    
                r1.Width = r1.Width * 2 - 2
    
                r1.Height = CInt(r1.Height / 2 - 2)
    
    
                e.Graphics.FillRectangle(New SolidBrush(Me.DataGridView1.ColumnHeadersDefaultCellStyle.BackColor), r1)
    
                Dim format As New StringFormat()
    
                format.Alignment = StringAlignment.Center
    
                format.LineAlignment = StringAlignment.Center
    
                e.Graphics.DrawString(monthes(j \ 2), Me.DataGridView1.ColumnHeadersDefaultCellStyle.Font, New SolidBrush(Me.DataGridView1.ColumnHeadersDefaultCellStyle.ForeColor), r1, format)
    
                j += 2
            End While
    
        End Sub
    
    
    
        Private Sub dataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs)
    
    
            If e.RowIndex = -1 AndAlso e.ColumnIndex > -1 Then
    
    
                e.PaintBackground(e.CellBounds, False)
    
    
    
                Dim r2 As Rectangle = e.CellBounds
    
                r2.Y = CInt(r2.Y + (e.CellBounds.Height / 2))
    
                r2.Height = CInt(e.CellBounds.Height / 2)
    
                e.PaintContent(r2)
    
    
                e.Handled = True
            End If
    
        End Sub

    De cualquier manera creo que es eso lo que necesitaba, aparte el ejemplo está mu bien, porque contempla otras posibilidades-

    Bueno, si sabes como puedo solucionar lo de las dos líneas, creo que ya estará arreglado.

    Un cordial saludo.

    Gemma

    miércoles, 4 de julio de 2012 8:32
  • LA verdad es que yo soy más de C# que de VB.NET pero el equivalente del += de C# es el AddHandler de VB.NET, por lo que creo que ese código quedaría asi

    C#

    Me.dataGridView1.CellPainting += New DataGridViewCellPaintingEventHandler(AddressOf dataGridView1_CellPainting)
    VB.NET
    AddHandler Me.dataGridView1.CellPainting, AddressOf DataGridViewCellPaintingEventHandler
    Como extra te comento que el operador -= de C# se llama RemoveHandler en VB.NET


    Atentamente, Sergio.

    Blog
    Twitter

    miércoles, 4 de julio de 2012 8:51
  • Hola Sergio:

    Continúa el error en :

    DataGridViewCellPaintingEventHandler

    Indica que se trata de un tipo y que no se puede usar como expresión. No tengo ni idea de que se tiene que hacer.

    Bueno, vamos a ver si se nos ocurre algo para solucionarlo. Siento no tener idea de "C#".

    Atentamente.

    Gemma

    • Marcado como respuesta gemma_campillo miércoles, 4 de julio de 2012 9:18
    miércoles, 4 de julio de 2012 9:02
  • Perdona pero cometí un error en la traducción. Es así

    AddHandler Me.dataGridView1.CellPainting, AddressOf dataGridView1_CellPainting
    Después del AddressOf hay que poner el método que va a manejar el evento.


    Atentamente, Sergio.

    Blog
    Twitter

    miércoles, 4 de julio de 2012 9:04
  • Hola Sergio:

    Bueno, con lo tuyo y con un ejemplo que hay en vb.net del mismo código, ya funciona. es un enlace muy bueno para podcer solucionar esto de las merge cells.

    Te quedo muy agradecida por tu interés y disposición para ayudarme.

    Adjunto el código en vb.net por si alguien lo necesita.

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            With dataGridView1
                .Columns.Add("Team", "Team")
                .Columns.Add("JanWin", "Win")
                .Columns.Add("JanLoss", "Loss")
                .Columns.Add("FebWin", "Win")
                .Columns.Add("FebLoss", "Loss")
                .Columns.Add("MarWin", "Win")
                .Columns.Add("MarLoss", "Loss")
     
                ' Schedule column widths
                For j As Integer = 1 To .Columns.Count - 1
                    .Columns(j).Width = 45
                Next
     
                .ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing
                .ColumnHeadersHeight = .ColumnHeadersHeight * 2
                .ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomCenter
     
            End With
     
        End Sub
     
        Private Sub dataGridView1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles dataGridView1.Paint
     
            Dim days As String() = {"January", "February", "March"}
            Dim r1 As Rectangle
            Dim format As StringFormat
     
            ' Fill-in the empty space above the column 0 header
            r1 = dataGridView1.GetCellDisplayRectangle(0, -1, True)
            r1.X += 1
            r1.Y += 1
            r1.Width = r1.Width * 2 - 2
            r1.Height = r1.Height / 2 - 1
            e.Graphics.FillRectangle(New SolidBrush(Me.dataGridView1.ColumnHeadersDefaultCellStyle.BackColor), r1)
            format = New StringFormat()
            format.Alignment = StringAlignment.Center
            format.LineAlignment = StringAlignment.Center
     
            For j As Integer = 0 To 6 Step 2
                r1 = dataGridView1.GetCellDisplayRectangle(j + 1, -1, True)
                r1.X += 1
                r1.Y += 1
                r1.Width = r1.Width * 2 - 2
                r1.Height = r1.Height / 2 - 1
                e.Graphics.FillRectangle(New SolidBrush(Me.dataGridView1.ColumnHeadersDefaultCellStyle.BackColor), r1)
                format = New StringFormat()
                format.Alignment = StringAlignment.Center
                format.LineAlignment = StringAlignment.Center
                e.Graphics.DrawString(days(j / 2), _
                                      dataGridView1.ColumnHeadersDefaultCellStyle.Font, _
                                      New SolidBrush(Me.dataGridView1.ColumnHeadersDefaultCellStyle.ForeColor), r1, format)
            Next
     
        End Sub
     
        Private Sub dataGridView1_CellPainting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles dataGridView1.CellPainting
     
            If ((e.RowIndex = -1) And (e.ColumnIndex >= 2)) Then
                e.PaintBackground(e.ClipBounds, False)
                Dim r2 As Rectangle = e.CellBounds
                r2.Y = e.CellBounds.Height / 2
                r2.Height = e.CellBounds.Height / 2
                e.PaintContent(r2)
                e.Handled = True
            End If
     
        End Sub
    

    Un cordial saludo.

    Gemma.

    miércoles, 4 de julio de 2012 9:18