如何在mouseover上更改DataGridView单元格图像?

时间:2016-09-16 00:44:55

标签: .net vb.net datagridview

我在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

如果我将鼠标悬停在其中一个单元格上(仅针对悬停的单元格而不是所有单元格),是否可以将图像切换到另一个图像?

1 个答案:

答案 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

当鼠标悬停在它上面时,这会将默认黑色项目符号更改为黄色:

enter image description here

请注意,如果空值无效,您可以使用CellErrorText提供红色感叹号和一些文字,而不是图像。