我使用的是Visual basic2012,我正在使用由excel 2010宏工作簿填充的datagridview。我的datagridview中的一些列是只读列,我希望当光标移动到这两列之一时,光标从默认光标变为I型光标。当我的代码处于当前状态时,如果该列是只读的,则在mouse_enter事件和mouse_leave事件中都有一条if-then语句。当我实现这段代码时,我很难理解为什么光标不会改变。如果有人对如何改进我的代码有任何建议,我将不胜感激。
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发布于 2013-06-07 08:46:09
在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-07 00:38:19
Kratz是正确的,因为您需要使用鼠标所在的单元格,而不是DataGridView的CurrentCell属性,后者不一定是鼠标所在的位置。这将使这件事变得更加棘手。
因此,基本上这意味着您需要计算要将光标更改为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语句中。您还需要使用鼠标离开事件来重置光标。
https://stackoverflow.com/questions/16965100
复制相似问题