我正在使用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
答案 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语句中。您还需要鼠标离开事件来重置光标。