Vb.net 使datagridview的绘制事件适用于项目中的所有datagridview
不确定在这个页面上搜索什么 在下面列出的涂料事件代码中,它绘制网格线来填充DATAGIDVIEW的空白,而不必添加空白行。 这段代码确实有效,但我仍在修改它 我想知道如何使事件成为我所有DataGridView的一部分,而不必重复和修改代码 例如,我有8个datagridview可以使用它,我不想在我的代码中有8个副本。最佳的方法是在每个datagridview上设置一个gridline属性,如果它为真,那么使用下面的代码来绘制线 但就目前而言,我必须将此代码作为每个datagridview的事件 我不想为我写的代码,但需要从哪里开始的建议Vb.net 使datagridview的绘制事件适用于项目中的所有datagridview,vb.net,winforms,datagridview,Vb.net,Winforms,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控件,而不是常用控件。这将需要大量的改变,但是…我看到这个问题在整个项目中不起作用,我一定会把它带到下一个级别,这样它就是它自己的工具箱控件,但是在我完成当前的项目后,谢谢你,我将尝试下一个