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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top