Vb.net 使datagridview的绘制事件适用于项目中的所有datagridview

Vb.net 使datagridview的绘制事件适用于项目中的所有datagridview,vb.net,winforms,datagridview,Vb.net,Winforms,Datagridview,不确定在这个页面上搜索什么 在下面列出的涂料事件代码中,它绘制网格线来填充DATAGIDVIEW的空白,而不必添加空白行。 这段代码确实有效,但我仍在修改它 我想知道如何使事件成为我所有DataGridView的一部分,而不必重复和修改代码 例如,我有8个datagridview可以使用它,我不想在我的代码中有8个副本。最佳的方法是在每个datagridview上设置一个gridline属性,如果它为真,那么使用下面的代码来绘制线 但就目前而言,我必须将此代码作为每个datagridview的事

不确定在这个页面上搜索什么 在下面列出的涂料事件代码中,它绘制网格线来填充DATAGIDVIEW的空白,而不必添加空白行。 这段代码确实有效,但我仍在修改它 我想知道如何使事件成为我所有DataGridView的一部分,而不必重复和修改代码 例如,我有8个datagridview可以使用它,我不想在我的代码中有8个副本。最佳的方法是在每个datagridview上设置一个gridline属性,如果它为真,那么使用下面的代码来绘制线

但就目前而言,我必须将此代码作为每个datagridview的事件

我不想为我写的代码,但需要从哪里开始的建议

Private Sub DataGridView1_Paint(sender As Object, e As PaintEventArgs) Handles DataGridView1.Paint
        Dim intRowHeight As Integer
        Dim intTopOffset As Integer
        Dim intLeftOffset As Integer
        Dim objRowImage As System.Drawing.Bitmap
        Dim objGraphics As System.Drawing.Graphics
        Dim objRowFrame As System.Drawing.Rectangle
        Dim objRowFill As System.Drawing.Rectangle
        Dim objRowHeaderFrame As System.Drawing.Rectangle
        Dim intIndex As Integer
        Dim intLastIndex As Integer
        Dim intRowHeadersWidth As Integer
        If DataGridView1.AllowUserToAddRows Then
            intLastIndex = DataGridView1.NewRowIndex
        Else
            intLastIndex = DataGridView1.Rows.Count - 1
        End If
        If DataGridView1.RowHeadersVisible Then
            intRowHeadersWidth = DataGridView1.RowHeadersWidth
        Else
            intRowHeadersWidth = 1
        End If
        intRowHeight = DataGridView1.RowTemplate.Height
        intTopOffset = DataGridView1.ColumnHeadersHeight + intRowHeight * (intLastIndex + 1)
        If DataGridView1.Height - intTopOffset > intRowHeight Then
            objRowImage = New System.Drawing.Bitmap(DataGridView1.Width, intRowHeight)
            objGraphics = System.Drawing.Graphics.FromImage(objRowImage)
            objRowFrame = New System.Drawing.Rectangle(0, 0, DataGridView1.Width, intRowHeight)
            objGraphics.DrawRectangle(System.Drawing.SystemPens.ControlDark, objRowFrame)
            objRowFill = New System.Drawing.Rectangle(1, 1, DataGridView1.Width - 2, intRowHeight - 2)
            objGraphics.FillRectangle(System.Drawing.SystemBrushes.Window, objRowFill)
            objRowHeaderFrame = New System.Drawing.Rectangle(2, 2, intRowHeadersWidth - 2, intRowHeight - 4)
            objGraphics.FillRectangle(New System.Drawing.SolidBrush(DataGridView1.RowHeadersDefaultCellStyle.BackColor), objRowHeaderFrame)
            intLeftOffset = intRowHeadersWidth
            For Each objColumn As System.Windows.Forms.DataGridViewColumn In DataGridView1.Columns
                If objColumn.Visible Then
                    intLeftOffset += objColumn.Width
                    objGraphics.DrawLine(System.Drawing.SystemPens.ControlDark, New System.Drawing.Point(intLeftOffset, 0), New System.Drawing.Point(intLeftOffset, intRowHeight))
                End If
            Next objColumn
            intIndex = (DataGridView1.Height - intTopOffset) \ intRowHeight
            For j As Integer = 0 To intIndex
                e.Graphics.DrawImage(objRowImage, 0, intTopOffset + j * intRowHeight)
            Next j
        End If
    End Sub

首先,在
句柄
关键字后添加所有DataGridView:

Private Sub DataGridView1_Paint(sender As Object, e As PaintEventArgs) _
    Handles DataGridView1.Paint, DataGridView2.Paint, DataGridView3.Paint, etc...
接下来,将
sender
参数强制转换为DataGridView:

    Dim DG As DataGridView = DirectCast(sender, DataGridView)
最后,将所有代码更改为使用
DG
而不是
DataGridView1

Private Sub DG_Paint(sender As Object, e As PaintEventArgs) Handles DG.Paint, DataGridView2.Paint, DataGridView3.Paint
    Dim DG As DataGridView = DirectCast(sender, DataGridView)

    Dim intRowHeight As Integer
    Dim intTopOffset As Integer
    Dim intLeftOffset As Integer
    Dim objRowImage As System.Drawing.Bitmap
    Dim objGraphics As System.Drawing.Graphics
    Dim objRowFrame As System.Drawing.Rectangle
    Dim objRowFill As System.Drawing.Rectangle
    Dim objRowHeaderFrame As System.Drawing.Rectangle
    Dim intIndex As Integer
    Dim intLastIndex As Integer
    Dim intRowHeadersWidth As Integer
    If DG.AllowUserToAddRows Then
        intLastIndex = DG.NewRowIndex
    Else
        intLastIndex = DG.Rows.Count - 1
    End If
    If DG.RowHeadersVisible Then
        intRowHeadersWidth = DG.RowHeadersWidth
    Else
        intRowHeadersWidth = 1
    End If
    intRowHeight = DG.RowTemplate.Height
    intTopOffset = DG.ColumnHeadersHeight + intRowHeight * (intLastIndex + 1)
    If DG.Height - intTopOffset > intRowHeight Then
        objRowImage = New System.Drawing.Bitmap(DG.Width, intRowHeight)
        objGraphics = System.Drawing.Graphics.FromImage(objRowImage)
        objRowFrame = New System.Drawing.Rectangle(0, 0, DG.Width, intRowHeight)
        objGraphics.DrawRectangle(System.Drawing.SystemPens.ControlDark, objRowFrame)
        objRowFill = New System.Drawing.Rectangle(1, 1, DG.Width - 2, intRowHeight - 2)
        objGraphics.FillRectangle(System.Drawing.SystemBrushes.Window, objRowFill)
        objRowHeaderFrame = New System.Drawing.Rectangle(2, 2, intRowHeadersWidth - 2, intRowHeight - 4)
        objGraphics.FillRectangle(New System.Drawing.SolidBrush(DG.RowHeadersDefaultCellStyle.BackColor), objRowHeaderFrame)
        intLeftOffset = intRowHeadersWidth
        For Each objColumn As System.Windows.Forms.DataGridViewColumn In DG.Columns
            If objColumn.Visible Then
                intLeftOffset += objColumn.Width
                objGraphics.DrawLine(System.Drawing.SystemPens.ControlDark, New System.Drawing.Point(intLeftOffset, 0), New System.Drawing.Point(intLeftOffset, intRowHeight))
            End If
        Next objColumn
        intIndex = (DG.Height - intTopOffset) \ intRowHeight
        For j As Integer = 0 To intIndex
            e.Graphics.DrawImage(objRowImage, 0, intTopOffset + j * intRowHeight)
        Next j
    End If
End Sub

首先,将方法
共享到某个类中,或者将其放入
模块中
在此之后,您的事件处理程序可以在整个项目中以不同的形式使用
然后,正如@idle\u Mind所提到的,将
sender
对象转换为
DataGridView
类型并在事件处理程序中使用

公共模块YourSomeModule
公共子DataGridView_MyHandlerPaint(发送方作为对象,e作为PaintEventArgs)
'从“发件人”对象强制转换DataGridView的实例
'将其命名为代码中的名称,
'那么您不需要更改代码中的名称
(如果您没有使用“Me.DataGridView”,如果是,请删除“Me”。)
Dim DataGridView1作为DataGridView=DirectCast(发送方,DataGridView)
“这是你的密码
端接头
终端公众
然后,您只需要做一件事—将处理程序添加到表单中datagridview的
Paint
事件中。
在构造函数中在
Me.Initialize()之后执行该操作

Public Class MyForm1

    Public Sub New()
         Me.Initialize()
         AddHandler Me.DataGridView1.Paint, 
                    AddressOf YourSomeModule.DataGridView_MyHandlerPaint
    End Sub

End Class
另一种形式

Public Class MyForm2

    Public Sub New()
         Me.Initialize()
         AddHandler Me.DataGridView2.Paint, 
                    AddressOf YourSomeModule.DataGridView_MyHandlerPaint
    End Sub

End Class

只需制作自己的datagridview版本

创建一个新类,继承Datagridview,向paint事件和新属性添加一些功能,重新生成受影响的项目并使用新类,就像使用原始类一样,还具有一些额外的功能。。。因为它是

Public Class mdgv
    Inherits DataGridView
    Property doit As Boolean = False
    Private Sub mdgv_Paint(sender As Object, e As PaintEventArgs) Handles Me.Paint
        If doit = True Then
            MessageBox.Show("painted")
        End If

    End Sub
End Class

然后,将当前DATAGRIDVIEW对象替换为新类MDGV。希望这有帮助。:

这是可行的,我将查看其他答案,看看哪一个更好。这不适用于项目中的所有DataGridView。仅适用于一种形式的DataGridView。@Fabio,true。这是一个“快速修复”。AddHandler也能很好地工作。我的解决方案是设计时方法,而您的解决方案是运行时方法。更好的方法是从DataGridView继承并重写Paint()事件。然后,您将使用工具箱顶部的新DataGridView控件,而不是常用控件。这将需要大量的改变,但是…我看到这个问题在整个项目中不起作用,我一定会把它带到下一个级别,这样它就是它自己的工具箱控件,但是在我完成当前的项目后,谢谢你,我将尝试下一个