Vb.net 在Visual Basic.net中将鼠标左键悬停在按钮上时检测鼠标左键何时按下
因此,我尝试在VB.net中创建一个24x7布局的调度网格(与UTorrent中的调度程序完全相同,如果有人熟悉的话)。我希望能够向下单击并拖动一系列正方形来更改它们的值 我已经找到了这个基本上有效的示例代码Vb.net 在Visual Basic.net中将鼠标左键悬停在按钮上时检测鼠标左键何时按下,vb.net,Vb.net,因此,我尝试在VB.net中创建一个24x7布局的调度网格(与UTorrent中的调度程序完全相同,如果有人熟悉的话)。我希望能够向下单击并拖动一系列正方形来更改它们的值 我已经找到了这个基本上有效的示例代码 Private Sub DataGridView3_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView3.CellMouseMove Dim grvS
Private Sub DataGridView3_MouseHover(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView3.CellMouseMove
Dim grvScreenLocation As Point = DataGridView3.PointToScreen(DataGridView3.Location)
Dim tempX As Integer = DataGridView.MousePosition.X - grvScreenLocation.X + DataGridView3.Left
Dim tempY As Integer = DataGridView.MousePosition.Y - grvScreenLocation.Y + DataGridView3.Top
Dim hit As DataGridView.HitTestInfo = DataGridView3.HitTest(tempX, tempY)
cellX = hit.RowIndex
cellY = hit.ColumnIndex
TextBox3.Text = cellX
TextBox14.Text = cellY
End Sub
如前所述,这会产生所需的结果,但是我只需要在鼠标按钮按下时将cellx和celly返回到文本框。这可以通过处理鼠标左键按下、鼠标移动和鼠标左键向上来实现 当您在网格上收到鼠标左键按下事件时,记录鼠标位置并设置标志。在鼠标移动处理程序中,如果设置了该标志,则高亮显示初始位置和当前鼠标位置之间的所有单元格。当收到鼠标左键向上时(设置网格时在网格上),提交单元格选择(并清除标志) 我已经成功地使用了这项技术一年了 以下是您需要做的大致概述:
Dim isSelecting As Boolean
Dim selectionStart As Point
Protected Overrides Sub OnMouseLeftButtonDown(e As MouseButtonEventArgs)
MyBase.OnMouseLeftButtonDown(e)
Dim position = e.GetPosition(Me)
Dim hit = VisualTreeHelper.HitTest(MyGrid, position)
If hit IsNot Nothing Then
isSelecting = True
selectionStart = position
End If
End Sub
Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
MyBase.OnMouseMove(e)
If isSelecting Then
Dim position = e.GetPosition(Me)
' Update selection
End If
End Sub
Protected Overrides Sub OnMouseLeftButtonUp(e As MouseButtonEventArgs)
MyBase.OnMouseLeftButtonUp(e)
If isSelecting Then
Dim position = e.GetPosition(Me)
' Commit selection
End If
End Sub
这给了我想要的
Private cellX As Integer = 0
Private cellY As Integer = 0
Private Sub DataGridView3_MouseHover(ByVal sender As System.Object, ByVal e As MouseEventArgs) Handles DataGridView3.CellMouseMove
Dim grvScreenLocation As Point = DataGridView3.PointToScreen(DataGridView3.Location)
Dim tempX As Integer = DataGridView.MousePosition.X - grvScreenLocation.X + DataGridView3.Left
Dim tempY As Integer = DataGridView.MousePosition.Y - grvScreenLocation.Y + DataGridView3.Top
Dim hit As DataGridView.HitTestInfo = DataGridView3.HitTest(tempX, tempY)
cellX = hit.RowIndex
cellY = hit.ColumnIndex
If e.Button = Windows.Forms.MouseButtons.Left Then
TextBoxX.Text = cellX
TextBoxY.Text = cellY
DataGridView3.Rows(cellX).Cells(cellY).Style.BackColor = Color.Red
End If
End Sub
通常,您可以只使用MouseEnter事件,但在许多控件上,如果鼠标按钮按下,则不会触发该事件,因为该组合是为DragDrop操作保留的(仅在DoDragDrop操作后触发),感谢示例代码!我忘了提到我对VB.net有点陌生,所以当我今晚下班回家时,我必须坐下来想想这意味着什么好的,我使用的是一系列按钮,以网格样式放置,而不是实际的网格。我无法使用gridview获得想要的结果。但是,在创建datagridview后,我发现OnMouseLeftButtonDown不是System.Windows.Form.Form的成员,而e.GetPosition不是System.Windows.Forms.MouseEventTargetary的成员。您没有指定框架,示例是在WPF中,但原则是相同的framework 4.5。在这个WPF中有很多,我似乎找不到一个有效的例子。