Charles Kiel
Charles Kiel

Reputation: 127

detect when left mouse button is down while hovering over a button in Visual Basic.net

So I'm attempting to create a schedule grid in VB.net (exactly like the scheduler in UTorrent, if anyone is familiar) in a 24x7 layout. I want to be able to click down and drag over a series of squares to change the values of them.

I've been able to find this sample code that mostly works.

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

As written, this produces the desired results, however I need to have it only return cellx and celly to the text boxes only when the mouse button is down.

Upvotes: 2

Views: 2086

Answers (2)

Charles Kiel
Charles Kiel

Reputation: 127

This gave me what I wanted.

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

Upvotes: 0

Phillip Trelford
Phillip Trelford

Reputation: 6543

This can be accomplished by handling mouse left button down, mouse move and mouse left button up.

When you receive a mouse left button down event on the grid, record the mouse position and set a flag. In the mouse move handler if the flag is set, highlight all cells between the initial position and the current mouse position. On receiving a mouse left button up (on the grid when the grid is set) commit the cell selection (and clear the flag).

I've used this technique successfully for a fractal zoom.

Here's a rough outline of what you need to do:

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

Upvotes: 2

Related Questions