将鼠标悬停在datagridview中的只读列上时,将光标更改为“I-beam”

时间:2013-06-06 14:42:18

标签: vb.net cursor datagridviewcolumn

我正在使用Visual Basic 2012,而我正在使用由excel 2010宏工作簿填充的datagridview。我的datagridview中的一些列是只读列,当光标移动到两列中的一列时,我希望光标从默认光标更改为工字梁。正如我的代码现在一样,如果列是只读的,我在if-then事件和mouse_enter事件中有一个mouse_leave语句。当我实现这段代码时,我无法理解为什么光标没有改变。如果有人对如何改进我的代码有任何建议,我将非常感激。

Private Sub DataGridView1_MouseHover(sender As Object, e As EventArgs) Handles DataGridView1.MouseHover
    If DataGridView1.CurrentCell.ReadOnly = True Then
        Cursor.Current = Cursors.IBeam
    Else
        Cursor.Current = Cursors.Default
    End If
End Sub

Private Sub DataGridView1_MouseLeave(sender As Object, e As EventArgs) Handles DataGridView1.MouseLeave
    Cursor.Current = Cursors.Default
End Sub

2 个答案:

答案 0 :(得分:1)

在CellMouseMove事件中尝试..

Private Sub DataGridView1_CellMouseMove(sender As Object, e As EventArgs) Handles DataGridView1.CellMouseMove

    Dim x as Integer = e.ColumnIndex

    If DataGridView1.Columns(x).ReadOnly Then
        Cursor.Current = Cursors.IBeam
    Else
        Cursor.Current = Cursors.Default
    End If
End Sub

答案 1 :(得分:0)

Kratz是正确的,因为您需要使用鼠标所在的单元格而不是CurrentCell的{​​{1}}属性,而DataGridView属性并非鼠标所在的位置。这将使这更加棘手。

所以基本上这意味着您需要计算要将光标更改为IBeam的每列的下限和上限。因此,假设您有一个包含3列的datagridview,并且您希望将IBeam用于第二列。您的下限将是第一列的宽度,上限将是第一列的宽度加上第二列的宽度。

所以你的代码看起来像是:

Private Sub DataGridView1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles DataGridView1.MouseMove
    If Not e.Location.IsEmpty Then
        Dim lowerBounds As Integer = DataGridView1.Columns("FirstColumnsName").Width
        Dim UpperBounds As Integer = DataGridView1.Columns("FirstColumnsName").Width + DataGridView1.Columns("SecondColumnsName").Width

        If e.X >= lowerBounds AndAlso e.X < UpperBounds Then
            Cursor.Current = Cursors.IBeam
        Else
            Cursor.Current = Cursors.Default
        End If
    End If
End Sub

如果要切换多个列,则需要计算它们所覆盖的空间并将它们分别添加到if语句中。您还需要鼠标离开事件来重置光标。