0

我正在使用 Visual Basic 2012,并且正在使用datagridview由 excel 2010 宏工作簿填充的内容。我的某些列datagridview是只读列,当光标移动到两列之一时,我希望光标从默认光标变为 I 形。由于我的代码现在就在,如果该列是只读的,我在event 和event 中有一个if-then声明。我无法理解为什么在实现此代码时光标没有改变。如果有人对如何改进我的代码有任何建议,我将不胜感激。mouse_entermouse_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
4

2 回答 2

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
于 2013-06-07T00:46:08.877 回答
0

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

所以基本上这意味着您需要计算要将光标更改为 IBeam 的每一列的下限和上限。因此,假设您有一个包含 3 列的数据网格视图,并且您想将 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 语句中。您还需要鼠标离开事件来重置光标。

于 2013-06-06T16:38:18.993 回答