Desactive la rueda de desplazamiento del mouse en Combobox vb.net
-
24-10-2019 - |
Pregunta
¿Alguien sabe de una forma de deshabilitar la rueda de desplazamiento del mouse cuando un control como un Combobox o ListBox tiene enfoque? Para mis propósitos, Combobox es todo lo que necesito la respuesta.
Tengo una combinación de combox para activar una consulta SQL en SelectedIndexChanged, y desplazando accidentalmente la rueda, mientras que el Combobox tiene un enfoque que aproximadamente seis consultas SQL disparan simultáneamente.
Solución
El control ComboBox no le permite anular fácilmente el comportamiento del evento de la rueda del ratón. Agregue una nueva clase a su proyecto y pegue el código que se muestra a continuación. Compilar. Deje caer el nuevo control desde la parte superior de la caja de herramientas en su formulario.
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
Tenga cuidado de que esto también deshabilite la rueda en la lista desplegable.
Otros consejos
Encontré una respuesta de mezcla, puse este código en el evento Mousewheel:
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
Eso es todo. No necesita crear una nueva clase, si tiene su proyecto en un estado avanzado.
Si subclase el control, es posible (disculpas por el 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);
}
}
Una de esas opciones sería agregar un controlador al Combobox, y dentro de ese comboBox, resolver la situación. No estoy seguro de cómo se configura su código, pero supongo que si sabía cuándo sucedía el evento, podría configurar algún tipo de condicional para evitar que las consultas ocurran
'''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
De esta manera, podría mantener al usuario que pueda desplazarse en el comboBox, pero también puede evitar que las consultas ocurran
Combinando todas las respuestas en este hilo, la mejor solución si no desea crear un control personalizado es manejar el evento Mousewheel. El siguiente también permitirá que la lista se desplazará si se deja caer.
Suponiendo que su comboBOX se llama Combobox1:
If Not ComboBox1.DroppedDown Then
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
End If
Tenía exactamente el mismo problema, pero descubrí que simplemente cambiar el enfoque del control después de que la consulta se ejecutó a otro control, como el botón "Consulta", funcionó mejor que perfecto. También me permitió desplazar aún el control hasta que el INDEX seleccionado realmente cambió y era solo una línea de código.
Simplemente coloque esto en el evento de la rueda del mouse o en un solo controlador para todos los controles a los que se aplica, tal vez llamarlo Wheelsnubber. DirectCast (E, HandledMouseEventArgs) .Handled = True