Подсказка по DataGridView



У меня есть всплывающая подсказка, показываемая при наведении курсора на строку в моем DataGridView-отлично работает, за исключением мерцания всплывающей подсказки при наведении курсора на строку, которая ее отображает.

Private Sub DataGridView1_MouseHover(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseMove
    Dim hit As DataGridView.HitTestInfo = DataGridView1.HitTest(e.X, e.Y)

    If hit.Type = DataGridViewHitTestType.Cell Then

        If Not hit Is m_HoveredItem Then
            Me.ToolTip2.Hide(Me.DataGridView1)
            m_HoveredItem = hit
            If hit Is Nothing Then
                Me.ToolTip2.SetToolTip(Me.DataGridView1, "")
            Else
                'Me.ToolTip2.SetToolTip(Me.DataGridView1, ConnectedUsers(Me.DataGridView1.Rows(hit.RowIndex).Cells("Database").Value, Instance))
                Me.ToolTip2.Show(ConnectedUsers(Me.DataGridView1.Rows(hit.RowIndex).Cells("Database").Value, Instance), DataGridView1, e.X, e.Y)
            End If
        End If

    End If

End Sub

Я использовал аналогичный метод для ListView, который отлично работал:

Private m_HoveredItem As ListViewItem
Private Sub lv_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

Dim lvi As ListViewItem = Me.LVDatabases.GetItemAt(e.X, e.Y)

If Not lvi Is m_HoveredItem Then
    Me.ToolTip2.Hide(Me.LVDatabases)
    m_HoveredItem = lvi
    If lvi Is Nothing Then
        Me.ToolTip2.SetToolTip(Me.LVDatabases, "")
    Else
        Me.ToolTip2.SetToolTip(Me.LVDatabases, ConnectedUsers(Me.LVDatabases.GetItemAt(e.X, e.Y).Text, Instance))
    End If
End If
End Sub
125   3  

3 ответов:

Private cellColumnIndex As Integer = -1, cellRowIndex As Integer = -1
Private Sub testDataGridView_CellMouseMove(ByVal sender As Object, ByVal e As DataGridViewCellMouseEventArgs) Handles DataGridView1.CellMouseMove
    If e.ColumnIndex <> Me.cellColumnIndex OrElse e.RowIndex <> Me.cellRowIndex Then
        Me.ToolTip2.Hide(Me.DataGridView1)
        Me.cellColumnIndex = e.ColumnIndex
        Me.cellRowIndex = e.RowIndex
        If Me.cellColumnIndex >= 0 AndAlso Me.cellRowIndex >= 0 Then
            Me.ToolTip2.SetToolTip(Me.DataGridView1, ConnectedUsers(Me.DataGridView1.Rows(e.RowIndex).Cells("Database").Value, Instance))
        End If
    End If
End Sub

Для datagridview, чтобы показать ваш tooltiptext, вы должны установить свойство "showcelltooltips" в false, тогда будет показан только ваш текст подсказки

FWIW, я считаю, что это ошибка в DataGridView на Windows 7. Мы использовали эту технику в приложении, написанном на C# и работающем под управлением Windows XP. Все работало нормально, но когда мы перенесли приложение в Windows 7, мы заметили эту мерцающую проблему. После исследования мы обнаружили повторные вызовы обработчика событий MouseMove. Я добавил простую строку трассировки в верхней части обработчика, которая только что сообщила местоположение мыши при запуске события, т. е. X и e. Y. мы видели непрерывное повторное выполнение в то же самое, даже когда убираешь руку с мыши и отодвигаешь стул от стола.

Исследование на MSDN в то время показало, что событие не будет инициировано, когда мышь не двигалась. Это, безусловно, кажется неправильным для представления DataGridView. Мы не заметили этой проблемы ни на одном другом контроле, но мы не проводили исчерпывающего тестирования.

Профиль клиента .Net 3.5, приложение c# WinForms

    Ничего не найдено.

Добавить ответ:
Отменить.