Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在Visual Basic.net中将鼠标左键悬停在按钮上时检测鼠标左键何时按下_Vb.net - Fatal编程技术网

Vb.net 在Visual Basic.net中将鼠标左键悬停在按钮上时检测鼠标左键何时按下

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

因此,我尝试在VB.net中创建一个24x7布局的调度网格(与UTorrent中的调度程序完全相同,如果有人熟悉的话)。我希望能够向下单击并拖动一系列正方形来更改它们的值

我已经找到了这个基本上有效的示例代码

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中有很多,我似乎找不到一个有效的例子。