vb.netdatagridviewdouble-buffering

Double Buffering a DataGridview causing Selected cell become Black


Imports System
Imports System.Reflection
Imports System.Runtime.CompilerServices
Imports System.Windows.Forms

Module DGV_Extensions
    <Extension()>
    Public Sub DoubleBuffered(aDGV As DataGridView, Optional setting As Boolean = True)
        'usage: SomeDataGridView.DoubleBuffered(True)
        Dim dgvType As Type = aDGV.GetType
        Dim propInfo As Reflection.PropertyInfo
        propInfo = dgvType.GetProperty("DoubleBuffered", _
                                       Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic)

        propInfo.SetValue(aDGV, setting, Nothing)
    End Sub

End Module



Public Class Form1
    Dim table As New DataTable("Table")

    Private Sub Form1_Load_1(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or _
ControlStyles.UserPaint Or _
ControlStyles.DoubleBuffer, True)

        DataGridView1.DoubleBuffered(True)

        table.Columns.Add("Id", Type.GetType("System.String"))
        table.Columns.Add("DESC", Type.GetType("System.String"))
        table.Columns.Add("RELAY", Type.GetType("System.String"))
        table.Columns.Add("COMMAND", Type.GetType("System.String"))
        table.Columns.Add("DT", Type.GetType("System.String"))
        table.Columns.Add("A", Type.GetType("System.String"))
        table.Columns.Add("B", Type.GetType("System.String"))
        table.Columns.Add("C", Type.GetType("System.String"))
        table.Columns.Add("D", Type.GetType("System.String"))
        table.Columns.Add("E", Type.GetType("System.String"))
        table.Columns.Add("F", Type.GetType("System.String"))
        table.Columns.Add("G", Type.GetType("System.String"))
        table.Columns.Add("H", Type.GetType("System.String"))
        table.Columns.Add("I", Type.GetType("System.String"))
        table.Columns.Add("J", Type.GetType("System.String"))
        table.Columns.Add("K", Type.GetType("System.String"))
        table.Columns.Add("L", Type.GetType("System.String"))
        table.Columns.Add("M", Type.GetType("System.String"))
        table.Columns.Add("N", Type.GetType("System.String"))
        table.Columns.Add("O", Type.GetType("System.String"))
        table.Columns.Add("P", Type.GetType("System.String"))
        table.Columns.Add("Q", Type.GetType("System.String"))
        table.Columns.Add("R", Type.GetType("System.String"))
        table.Columns.Add("S", Type.GetType("System.String"))
        table.Columns.Add("T", Type.GetType("System.String"))
        table.Columns.Add("U", Type.GetType("System.String"))
        table.Columns.Add("V", Type.GetType("System.String"))
        table.Columns.Add("W", Type.GetType("System.String"))
        table.Columns.Add("X", Type.GetType("System.String"))
        table.Columns.Add("Y", Type.GetType("System.String"))
        table.Columns.Add("Z", Type.GetType("System.String"))
        table.Columns.Add("AA", Type.GetType("System.String"))
        table.Columns.Add("BB", Type.GetType("System.String"))
        table.Columns.Add("CC", Type.GetType("System.String"))
        table.Columns.Add("DD", Type.GetType("System.String"))
        table.Columns.Add("EE", Type.GetType("System.String"))
        table.Columns.Add("FF", Type.GetType("System.String"))
        table.Columns.Add("GG", Type.GetType("System.String"))
        table.Columns.Add("HH", Type.GetType("System.String"))
        table.Columns.Add("II", Type.GetType("System.String"))
        table.Columns.Add("JJ", Type.GetType("System.String"))
        table.Columns.Add("KK", Type.GetType("System.String"))
        table.Columns.Add("LL", Type.GetType("System.String"))
        table.Columns.Add("MM", Type.GetType("System.String"))
        table.Columns.Add("NN", Type.GetType("System.String"))
        table.Columns.Add("OO", Type.GetType("System.String"))
        table.Columns.Add("PP", Type.GetType("System.String"))
        table.Columns.Add("QQ", Type.GetType("System.String"))
        table.Columns.Add("RR", Type.GetType("System.String"))

        For j As Integer = 0 To 500
            table.Rows.Add("", "", "", "")
        Next

        DataGridView1.DataSource = table

    End Sub

    Private Sub DataGridView1_CellPainting(sender As Object, e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting


        Dim gfx = e.Graphics
        Dim pen As New Pen(Color.FromArgb(0, 0, 96))

        If e.RowIndex > -1 And e.ColumnIndex > -1 Then

            If DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Selected = True Then

                e.Paint(e.CellBounds, DataGridViewPaintParts.Border)

                Using cpen As New Pen(Color.Yellow, 1)
                    e.Graphics.DrawRectangle(cpen, e.CellBounds.X + 1, e.CellBounds.Y + 1, e.CellBounds.Width - 3, e.CellBounds.Height - 3)
                End Using

                e.Handled = True

            End If

        End If


    End Sub


End Class

Please help me, how to remove this black color on selected cell without removing double buffering code


Solution

  • In your CellPainting event handler, change the line:

    e.Paint(e.CellBounds, DataGridViewPaintParts.Border)
    

    to be

    e.Paint(e.CellBounds, DataGridViewPaintParts.All)
    

    When you specify DataGridViewPaintParts.Border all that you are asking the Paint function to do is draw ONLY THE BORDER when want you want, is for the Paint function to draw all parts of the cell (including the contents).