Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何在鼠标上方更改DataGridView单元格图像?_.net_Vb.net_Datagridview - Fatal编程技术网

.net 如何在鼠标上方更改DataGridView单元格图像?

.net 如何在鼠标上方更改DataGridView单元格图像?,.net,vb.net,datagridview,.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.IsNullOrE

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

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

首先,您的代码将为要显示该图像的每个单元格创建一个新图像。每个单元格并不真正需要自己的个人图像对象

此外,您可以将映像添加到资源中,而不是从磁盘加载(这意味着可以删除或移动文件)。从那里获取图像时,每次仍将创建一个新的图像对象,因此将它们存储在一个数组中:

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
                        }
然后像悬停一样使用它(无延迟):

专用子dgv1_CellMouseEnter(等)。。。
如果e.RowIndex<0或else dgv1.Rows(e.RowIndex).IsNewRow,则返回
如果e.ColumnIndex=5,则
dgv1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value=ImgBalls(6)
如果结束
端接头
专用子dgv1_CellMouseLeave(等)。。。
如果e.RowIndex<0或else dgv1.Rows(e.RowIndex).IsNewRow,则返回
如果e.ColumnIndex=5,则
dgv1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value=ImgBalls(0)
如果结束
端接头
当鼠标悬停在默认的黑色项目符号上时,会将其更改为黄色:


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

CellEnter(短暂延迟?)然后CellLeave撤销。不相关,但是如果您显示的是相同的图像或一小部分图像,您应该将它们加载到数组或列表中,而不是每次都创建一个新的数组或列表。每个单元格都需要自己的
glass.png
副本,您不必担心如何处理它们。好的,谢谢。所以我假设cell paint会成功在进入和离开时重新启动?不,这不起作用-当你激活手机时会启动。对不起,我更关注的是另一个花絮。CellMouseleve和CellMouseEnter是我在想的。yuk…^
每个手机都不**需要自己的个人副本…
你能详细说明一下将它们加载到arra中是什么意思吗y?你的意思是不是不从文件加载?我希望尽可能优化它。看起来正是我想要完成的,但找不到更多信息。感谢你花时间帮助,非常感谢!所有行都使用相同的黑色项目符号图像和相同的黄色图像。你可以实现标准的400ms ho通过在CellMouseEnter中设置标志和启动计时器来延迟,然后在CellMouseMove中实际设置图像。在这与实际悬停之间的约400ms差异中,似乎有点过分了
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