修改任何单元格的图像后,Datagridviewcell 工具提示不显示

Datagridviewcell Tooltip doesn't display after modifying image of any cell

在我的 winforms 应用程序中,我循环遍历 datagridview 的单元格,并根据其他列中的值为特定单元格添加工具提示。我在 cellformatting 事件处理程序中执行此操作,并且效果很好。这是代码:

Private Sub dgvResults_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgvResults.CellFormatting
Select Case dgvResults.Columns(e.ColumnIndex).Name
    Case "TradeInValue"
        DirectCast(dgvResults.Rows(e.RowIndex).Cells("TradeInValue"), DataGridViewTextBoxCell).ToolTipText = "Min = " & CDec(dgvResults.Item("BB_Min", e.RowIndex).FormattedValue).ToString("$#####.##") & ", Max = " & CDec(dgvResults.Item("BB_Max", e.RowIndex).FormattedValue).ToString("$#####.##")
        If Not IsNothing(dgvResults.Item("SelectedTrimIndex", e.RowIndex).FormattedValue) AndAlso dgvResults.Item("SelectedTrimIndex", e.RowIndex).FormattedValue.ToString.Trim.Length > 0 AndAlso CInt(dgvResults.Item("SelectedTrimIndex", e.RowIndex).FormattedValue.ToString) <> -1 Then
            If dgvResults.Item("ValueList", e.RowIndex).FormattedValue.ToString.Length > 0 Then
                Dim ValueParts() As String = dgvResults.Item("ValueList", e.RowIndex).FormattedValue.ToString.Split("|")
                'Dim selectedTrim As String = ValueParts(dgvResults.Item("SelectedTrimIndex", e.RowIndex).FormattedValue)
            End If
        End If

End Select
End Sub

然后,我在 cellpainting 事件处理程序中添加代码以隐藏特定图像,再次基于 datagridview 中的值。这是代码。

Private Sub dgvResults_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles dgvResults.CellPainting
    If e.ColumnIndex >= 0 AndAlso e.RowIndex >= 0 Then
        Select Case dgvResults.Columns(e.ColumnIndex).Name
            Case "VIN_Pic"
                If dgvResults.Rows(e.RowIndex).Cells("VIN_Value").FormattedValue = "" Then
                    DirectCast(dgvResults.Item(e.ColumnIndex, e.RowIndex), DataGridViewImageCell).Value = New Bitmap(1, 1)
                End If
            Case "EmailDisplayImage"
                If dgvResults.Rows(e.RowIndex).Cells("ListingContactEmail").FormattedValue = "" Then
                    DirectCast(dgvResults.Item(e.ColumnIndex, e.RowIndex), DataGridViewImageCell).Value = New Bitmap(1, 1)
                End If
        End Select
    End If

End Sub

添加此代码后,工具提示将不再显示。 CellToolTipTextNeeded 事件触发,并在参数中显示正确的文本,但它从未显示。注释掉将新图像分配给 datagridviewimagecells 的行,工具提示将再次开始显示。

我希望这个解释足够了。有什么想法吗?

使用下面的代码,您将 运行 放入内存,并且 GDI 对象很容易泄漏,因为每次绘制单元格时都会创建一个新的 Bitmap 实例。这也导致您的 ToolTip 无法显示。

DirectCast(dgvResults.Item(e.ColumnIndex, e.RowIndex), DataGridViewImageCell).Value = New Bitmap(1, 1)

在class级别定义空位图或添加为嵌入资源并使用它。

Dim emptyBitmap As New Bitmap(1, 1);

DirectCast(dgvResults.Item(e.ColumnIndex, e.RowIndex), DataGridViewImageCell).Value = emptyBitmap