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

时间:2015-01-09 16:44:09

标签: winforms datagridview

在我的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分配新图像的行,并且工具提示再次开始显示。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

Dim emptyBitmap As New Bitmap(1, 1);

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