none
Seleccionar celdas despues de CellPainting de DataGridView VB.NET RRS feed

  • Pregunta

  • buenos dias tengo un problema con un codigo, lo que hace es que pinta una linea negra para "separar" por grupos un conjunto de filas, el codigo lo saque de internet y lo modifique para que hiciera lo que yo queria, pero al parecer se pintan celdas sobre el DataGridView (gridpartidas) y no me permite seleccionar las celdas del grid

    este es el codigo

        Private Sub GridPartidas_CellPainting(sender As Object, e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles GridPartidas.CellPainting
            If e.RowIndex <> -1 Then
                Using gridBrushb As Brush = New SolidBrush(Color.Black), gridBrush As Brush = New SolidBrush(Me.GridPartidas.GridColor), backColorBrushb As Brush = New SolidBrush(e.CellStyle.BackColor)
                    Using gridLinePen As Pen = New Pen(gridBrushb, 2), gridLinePen2 As Pen = New Pen(gridBrush)
                        e.Graphics.FillRectangle(backColorBrushb, e.CellBounds)
    
    
                        If e.RowIndex < GridPartidas.Rows.Count - 2 AndAlso GridPartidas.Item(ColumnaOrdenPemsa, e.RowIndex + 1).Value = GridPartidas.Item(ColumnaOrdenPemsa, e.RowIndex).Value Then
                            e.Graphics.DrawLine(gridLinePen2, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
                        Else
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
                        End If
    
                        e.Graphics.DrawLine(gridLinePen2, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom)
                        e.Graphics.DrawString(CType(e.Value, String), e.CellStyle.Font, Brushes.Black, e.CellBounds.X + 2, e.CellBounds.Y + 5, StringFormat.GenericDefault)
    
    
                        e.Handled = True
                    End Using
                End Using
            End If
        End Sub
    alguien sabe como resolver este problema?

    • Cambiado Enrique M. Montejo lunes, 23 de mayo de 2016 5:53 Preguntas relacionadas con controles de Windows Forms.
    miércoles, 18 de mayo de 2016 14:22

Respuestas

  • El problema no es que no puedas seleccionar filas, si no que las filas seleccionadas las dibujas con los mismos colores que las no seleccionadas.

    Deberías utilizar diferentes colores para las filas seleccionadas:

        Private Sub GridPartidas_CellPainting(sender As Object, e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles GridPartidas.CellPainting
            If e.RowIndex <> -1 Then
                Dim cellBackColor = If(GridPartidas.Rows(e.RowIndex).Selected, e.CellStyle.SelectionBackColor, e.CellStyle.BackColor)
                Dim cellForeColor = If(GridPartidas.Rows(e.RowIndex).Selected, e.CellStyle.ForeColor, e.CellStyle.SelectionForeColor)
                Using gridBrushb As Brush = New SolidBrush(Color.Black), gridBrush As Brush = New SolidBrush(Me.GridPartidas.GridColor), backColorBrushb As Brush = New SolidBrush(cellBackColor)
                    Using gridLinePen As Pen = New Pen(gridBrushb, 2), gridLinePen2 As Pen = New Pen(gridBrush)
                        e.Graphics.FillRectangle(backColorBrushb, e.CellBounds)
    
    
                        If e.RowIndex < GridPartidas.Rows.Count - 2 AndAlso GridPartidas.Item(ColumnaOrdenPemsa, e.RowIndex + 1).Value = GridPartidas.Item(ColumnaOrdenPemsa, e.RowIndex).Value Then
                            e.Graphics.DrawLine(gridLinePen2, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
                        Else
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
                        End If
    
                        e.Graphics.DrawLine(gridLinePen2, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom)
                        e.Graphics.DrawString(CType(e.Value, String), e.CellStyle.Font, New SolidBrush(cellForeColor), e.CellBounds.X + 2, e.CellBounds.Y + 5, StringFormat.GenericDefault)
    
    
                        e.Handled = True
                    End Using
                End Using
            End If
        End Sub


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta RHCRD martes, 24 de mayo de 2016 16:13
    martes, 24 de mayo de 2016 7:57

Todas las respuestas

  • El problema no es que no puedas seleccionar filas, si no que las filas seleccionadas las dibujas con los mismos colores que las no seleccionadas.

    Deberías utilizar diferentes colores para las filas seleccionadas:

        Private Sub GridPartidas_CellPainting(sender As Object, e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles GridPartidas.CellPainting
            If e.RowIndex <> -1 Then
                Dim cellBackColor = If(GridPartidas.Rows(e.RowIndex).Selected, e.CellStyle.SelectionBackColor, e.CellStyle.BackColor)
                Dim cellForeColor = If(GridPartidas.Rows(e.RowIndex).Selected, e.CellStyle.ForeColor, e.CellStyle.SelectionForeColor)
                Using gridBrushb As Brush = New SolidBrush(Color.Black), gridBrush As Brush = New SolidBrush(Me.GridPartidas.GridColor), backColorBrushb As Brush = New SolidBrush(cellBackColor)
                    Using gridLinePen As Pen = New Pen(gridBrushb, 2), gridLinePen2 As Pen = New Pen(gridBrush)
                        e.Graphics.FillRectangle(backColorBrushb, e.CellBounds)
    
    
                        If e.RowIndex < GridPartidas.Rows.Count - 2 AndAlso GridPartidas.Item(ColumnaOrdenPemsa, e.RowIndex + 1).Value = GridPartidas.Item(ColumnaOrdenPemsa, e.RowIndex).Value Then
                            e.Graphics.DrawLine(gridLinePen2, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
                        Else
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
                        End If
    
                        e.Graphics.DrawLine(gridLinePen2, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom)
                        e.Graphics.DrawString(CType(e.Value, String), e.CellStyle.Font, New SolidBrush(cellForeColor), e.CellBounds.X + 2, e.CellBounds.Y + 5, StringFormat.GenericDefault)
    
    
                        e.Handled = True
                    End Using
                End Using
            End If
        End Sub


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    • Marcado como respuesta RHCRD martes, 24 de mayo de 2016 16:13
    martes, 24 de mayo de 2016 7:57
  • OH me funcionó casi perfecto, no tenia idea de que se podia declarar con un "if" gracias por ese conocimiento, relamente no tengo nada de experiencia con los eventos painting de los controles por eso estoy un poco perdido, por cierto dije que casi perfecto por que el codigo que me mandaste solo funcionaba cuando toda la fila estaba seleccionada pero de duje que solo tenia que cambiar/controlar esa parte del codigo

                Dim cellBackColor As System.Drawing.Color
                Dim cellForeColor As System.Drawing.Color
                If GridPartidas.Rows(e.RowIndex).Selected Or GridPartidas.Item(e.ColumnIndex, e.RowIndex).Selected Then
                    cellBackColor = e.CellStyle.SelectionBackColor
                    cellForeColor = e.CellStyle.SelectionForeColor
                Else
                    cellBackColor = e.CellStyle.BackColor
                    cellForeColor = e.CellStyle.ForeColor
                End If

    pero aun tengo un problema con el DrawString no se como hacer para que mis celdas que tienen el texto centrado se quede asi, por que despues del cellpainting el texto se queda a la izquierda, se que debe ser en esta seccion del codigo pero no se como modificarlo, como repito, tengo poca experiencia en esto del painting.

     e.Graphics.DrawString(CType(e.Value, String), e.CellStyle.Font, New SolidBrush(cellForeColor), e.CellBounds.X + 2, e.CellBounds.Y + 5, StringFormat.GenericDefault)
    

    Gracias Asier Villanueva

    martes, 24 de mayo de 2016 16:24
  • no se si hay maneras mas eficientes de resolver el problema de ajustar el texto en el DrawString del evento CellPainting pero lo logré de esta manera (pongo el codigo completo)

        Private Sub GridPartidas_CellPainting(sender As Object, e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles GridPartidas.CellPainting
            If e.RowIndex <> -1 And e.ColumnIndex <> -1 Then
                Dim cellBackColor As System.Drawing.Color
                Dim cellForeColor As System.Drawing.Color
                If GridPartidas.Rows(e.RowIndex).Selected Or GridPartidas.Item(e.ColumnIndex, e.RowIndex).Selected Then
                    cellBackColor = e.CellStyle.SelectionBackColor
                    cellForeColor = e.CellStyle.SelectionForeColor
                Else
                    cellBackColor = e.CellStyle.BackColor
                    cellForeColor = e.CellStyle.ForeColor
                End If
                Using gridBrushb As Brush = New SolidBrush(Color.Black), gridBrush As Brush = New SolidBrush(Me.GridPartidas.GridColor), backColorBrushb As Brush = New SolidBrush(cellBackColor)
                    Using gridLinePen As Pen = New Pen(gridBrushb, 2), gridLinePen2 As Pen = New Pen(gridBrush)
    
                        e.Graphics.FillRectangle(backColorBrushb, e.CellBounds)
                        If e.RowIndex < GridPartidas.Rows.Count - 2 AndAlso GridPartidas.Item(ColumnaOrdenPemsa, e.RowIndex + 1).Value = GridPartidas.Item(ColumnaOrdenPemsa, e.RowIndex).Value Then
                            e.Graphics.DrawLine(gridLinePen2, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
                        Else
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right - 1, e.CellBounds.Bottom - 1)
                        End If
    
                        e.Graphics.DrawLine(gridLinePen2, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, e.CellBounds.Bottom)
    
                        Dim XString As Integer
                        If e.CellStyle.Alignment = DataGridViewContentAlignment.BottomCenter Or e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter Or e.CellStyle.Alignment = DataGridViewContentAlignment.TopCenter Then
                            XString = e.CellBounds.X + ((e.CellBounds.Width / 2) - (e.Graphics.MeasureString(e.Value, e.CellStyle.Font, 300).Width / 2))
                        ElseIf e.CellStyle.Alignment = DataGridViewContentAlignment.BottomRight Or e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight Or e.CellStyle.Alignment = DataGridViewContentAlignment.TopRight Then
                            XString = (e.CellBounds.X + (e.CellBounds.Width - e.Graphics.MeasureString(e.Value, e.CellStyle.Font, 300).Width) - 2)
                        ElseIf e.CellStyle.Alignment = DataGridViewContentAlignment.BottomLeft Or e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft Or e.CellStyle.Alignment = DataGridViewContentAlignment.TopLeft Then
                            XString = e.CellBounds.X + 2
                        End If
                        e.Graphics.DrawString(CType(e.Value, String), e.CellStyle.Font, New SolidBrush(cellForeColor), XString, e.CellBounds.Y + 5, StringFormat.GenericDefault)
    
                        e.Handled = True
                    End Using
                End Using
    
            End If
        End Sub

    martes, 24 de mayo de 2016 17:18