Reputation: 3365
Does anyone know of a way to disable the mouse scroll wheel when a control such as a combobox or listbox has focus? For my purposes, combobox is all I need the answer for.
I have a combobox set to trigger a SQL query on SelectedIndexChanged, and accidentally scrolling the wheel while the combobox has focus causes about six SQL queries to fire off simultaneously.
Upvotes: 9
Views: 22851
Reputation: 331
i was struggling initially, but came up with a solution to change the dropdown style to simple in the mousewheel event, which doesnt support scrolling at all, and then on mouse click and mouse leave reset its style back to "dropdown" or "dropdownlist" - worked like a charm. heres the example code
Private Sub ComboBox_MouseWheel(sender As Object, e As MouseEventArgs) Handles ComboBox.MouseWheel
' Set style to 'Simple' which doesn't support scrolling, preventing the selection from changing accidentally if mouse is hovering over the ComboBox
ComboBox.DropDownStyle = ComboBoxStyle.Simple
End Sub
Private Sub ComboBox_MouseDown(sender As Object, e As MouseEventArgs) Handles ComboBox.MouseDown
' Set style back to 'DropDownList' and automatically drop it down, to revert changes potentially made by MouseWheel event
ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
ComboBox.DroppedDown = True
End Sub
Private Sub ComboBox_MouseLeave(sender As Object, e As EventArgs) Handles ComboBox.MouseLeave
' Ensures the UI goes back to how it should be visually
ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
End Sub
however, this solution is the best, as mentioned above:
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
what i call a "Ronsil Solution" - does exactly what it says on the tin!
Upvotes: 0
Reputation: 21
Just put this in the mousewheel event or in a single handler for all the controls this applies to, maybe call it wheelsnubber. DirectCast(e, HandledMouseEventArgs).Handled = True
Upvotes: 0
Reputation: 1
I had the exact same issue, but found that simply changing the focus of the control after the query executed to another control such as the "Query" button itself worked better than perfect. It also allowed me to still scroll the control until the SelectedIndex actually changed and was only one line of code.
Upvotes: 0
Reputation: 130
Combining all the answers on this thread, the best solution if you don't want to create a custom control is to handle the mousewheel event. The below will also allow the list to be scrolled if it is dropped down.
Assuming your combobox is called combobox1:
If Not ComboBox1.DroppedDown Then
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
End If
Upvotes: 0
Reputation: 161
I've found a mix response, put this code in the MouseWheel event:
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
That's all. You don't need to create a new class, if you have your project in an advanced state.
Upvotes: 16
Reputation: 1180
One such option would be to add a handler to the comboBox, and within that comboBox, resolve the situation. I'm not sure how your code is set up, but I'm assuming if you knew when the event was happening, you could set up some kind of conditional to prevent the queries from happening
'''Insert this statement where your form loads
AddHandler comboBoxBeingWatched.MouseWheel, AddressOf buttonHandler
Private Sub buttonHandler(ByVal sender As System.Object, ByVal e As System.EventArgs)
'''Code to stop the event from happening
End Sub
In this way, you'd be able to maintain the user being able to scroll in the comboBox, but also be able to prevent the queries from happening
Upvotes: 0
Reputation: 942438
The ComboBox control doesn't let you easily override behavior of the MouseWheel event. Add a new class to your project and paste the code shown below. Compile. Drop the new control from the top of the toolbox onto your form.
Friend Class MyComboBox
Inherits ComboBox
Protected Overrides Sub OnMouseWheel(ByVal e As MouseEventArgs)
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
End Sub
End Class
Beware that this also disables the wheel in the dropdown list.
Upvotes: 10
Reputation: 73303
If you subclass the control it's possible (apologies for the C#)
public class NoScrollCombo : ComboBox
{
[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)]
protected override void WndProc(ref Message m)
{
if (m.HWnd != this.Handle)
{
return;
}
if (m.Msg == 0x020A) // WM_MOUSEWHEEL
{
return;
}
base.WndProc(ref m);
}
}
Upvotes: 1