我有一个工具提示显示在我的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
答案 0 :(得分:5)
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
答案 1 :(得分:3)
为了让datagridview显示你的工具文本,你应该将属性“showcelltooltips”设置为false,然后只显示你的工具提示文本
答案 2 :(得分:2)
FWIW,我相信这是Windows 7上DataGridView中的一个错误。我们在用Windows XP运行的C#编写的应用程序中使用了这种技术。一切都运行良好,但当我们将应用程序移动到Windows 7时,我们注意到了这个闪烁的问题。经过调查,我们发现了对MouseMove事件处理程序的重复调用。我在处理程序的顶部添加了一条简单的跟踪线,它只是在事件触发时报告了鼠标的位置,e.X和e.Y.我们看到在同一点上连续重复执行,即使将鼠标和椅子从桌子上移开也是如此。
当时对MSDN的调查表明,当鼠标没有移动时不会触发事件。对于DataGridView来说,这似乎是不正确的。我们没有注意到任何其他控件的这个问题,但我们没有进行详尽的测试。
.Net 3.5 Client Profile,C#WinForms app