Vb.net DataGridView上的工具提示

Vb.net DataGridView上的工具提示,vb.net,Vb.net,当鼠标悬停在DataGridView中的某一行上时,我会看到一个工具提示——除了当鼠标悬停在显示它的某一行上时,工具提示会闪烁之外,效果非常好 Private Sub DataGridView1_MouseHover(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseMove Dim hit As DataGridView.Hi

当鼠标悬停在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
Private cellColumnIndex为整数=-1,cellRowIndex为整数=-1
私有子测试DataGridView_CellMouseMove(ByVal sender作为对象,ByVal e作为DataGridViewCellMouseEventArgs)处理DataGridView1.CellMouseMove
如果e.ColumnIndex Me.cellColumnIndex或e.RowIndex Me.cellRowIndex,则
Me.ToolTip2.Hide(Me.DataGridView1)
Me.cellColumnIndex=e.ColumnIndex
Me.cellRowIndex=e.RowIndex
如果Me.cellColumnIndex>=0,并且Me.cellRowIndex>=0,则
Me.ToolTip2.SetToolTip(Me.DataGridView1,ConnectedUsers(Me.DataGridView1.Rows(e.RowIndex).Cells(“数据库”).Value,实例))
如果结束
如果结束
端接头

FWIW,我相信这是Windows7上DataGridView中的一个错误。我们在Windows XP上用C语言编写的应用程序中使用了这种技术。一切正常,但当我们将应用程序移动到Windows7时,我们注意到了这个闪烁的问题。经过调查,我们发现重复调用了MouseMove事件处理程序。我在处理程序的顶部添加了一条简单的跟踪线,它只报告了事件触发时鼠标的位置,即e.X和e.Y。我们看到在同一点上连续重复执行,即使将鼠标和靠背从桌子上拿开

当时对MSDN的调查表明,当鼠标不移动时,不会触发该事件。对于DataGridView,这显然是不正确的。我们没有在任何其他控制中注意到这个问题,但我们没有进行详尽的测试


.Net 3.5客户端配置文件,C#WinForms应用程序要显示工具提示文本,请将属性“showcelltooltips”设置为false,然后仅显示工具提示文本

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