我在datagridviews列单元格中绘制图像,如下所示:
Private Sub dataGridView1_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
If e.ColumnIndex = 20 AndAlso e.RowIndex >= 0 Then
If String.IsNullOrEmpty(e.Value.ToString) Then
e.Paint(e.CellBounds, DataGridViewPaintParts.All)
Dim img As Image = Image.FromFile("C:\Users\me\Desktop\glass.png")
e.Graphics.DrawImage(img, e.CellBounds.Left + 10, e.CellBounds.Top + 5, 25, 25)
e.Handled = True
End If
End If
End Sub
如果我将鼠标悬停在其中一个单元格上(仅针对悬停的单元格而不是所有单元格),是否可以将图像切换到另一个图像?
答案 0 :(得分:3)
首先,您的代码正在为要显示该图像的每个单元格创建一个新图像。每个单元格都不需要自己的个人图像对象。
此外,您可以将图像添加到资源,而不是从磁盘加载(这意味着可以删除或移动文件)。从那里获取它将 仍然 每次创建一个新的图像对象,因此将它们存储在一个数组中:
Private ImgBalls As Image()
然后像FormLoad那样:
' ToDo: add a BulletColor enum for indexing
ImgBalls = New Image() {
My.Resources.ballblack, My.Resources.ballblue,
My.Resources.ballgreen, My.Resources.ballorange,
My.Resources.ballred, My.Resources.ballpurple,
My.Resources.ballyellow
}
然后使用喜欢悬停(无延迟):
Private Sub dgv1_CellMouseEnter(etc etc etc...
If e.RowIndex < 0 OrElse dgv1.Rows(e.RowIndex).IsNewRow Then Return
If e.ColumnIndex = 5 Then
dgv1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = ImgBalls(6)
End If
End Sub
Private Sub dgv1_CellMouseLeave(etc etc etc...
If e.RowIndex < 0 OrElse dgv1.Rows(e.RowIndex).IsNewRow Then Return
If e.ColumnIndex = 5 Then
dgv1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = ImgBalls(0)
End If
End Sub
当鼠标悬停在它上面时,这会将默认黑色项目符号更改为黄色:
请注意,如果空值无效,您可以使用CellErrorText
提供红色感叹号和一些文字,而不是图像。