2010-06-03 142 views
9

¿Alguien sabe de una forma de desactivar la rueda de desplazamiento del mouse cuando un control como un cuadro combinado o cuadro de lista tiene el foco? Para mis propósitos, el combobox es todo para lo que necesito la respuesta.Deshabilitar la rueda de desplazamiento del mouse en el cuadro combinado VB.NET

Tengo un cuadro combinado configurado para activar una consulta SQL en SelectedIndexChanged, y el desplazamiento accidental de la rueda mientras el cuadro combinado tiene el foco provoca que se activen aproximadamente seis consultas SQL simultáneamente.

Respuesta

9

El control ComboBox no le permite anular fácilmente el comportamiento del MouseWhe el evento. Agregue una nueva clase a su proyecto y pegue el código que se muestra a continuación. Compilar. Coloque 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 en cuenta que esto también deshabilita la rueda en la lista desplegable.

+0

Esto funciona genial. Gracias. –

+2

Puede verificar la propiedad [DroppedDown] (http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.droppeddown.aspx) de ComboBox y no establecer la propiedad manejada de EventArg si es True . Eso mantendrá la rueda de desplazamiento funcionando cuando se muestre la lista desplegable. – Jeras

+0

Si desea pasar los eventos de MouseWheel al control principal de ComboBox, después de 'mwe.Handled = True' puede llamar a' Parent.Focus' (o 'Parent.Parent.Focus' hasta que llegue a un control que pueda enfocar, aunque esto se pondrá complicado). Cuando está envuelto en un 'If DroppedDown = False', esto funciona bastante bien cuando no quiere que el ComboBox interfiera con la capacidad de desplazamiento de un padre. – MCattle

0

Una de estas opciones sería agregar un controlador al comboBox, y dentro de ese comboBox, resolver la situación. No estoy seguro de cómo el código está configurado, pero estoy suponiendo que si sabía cuando el evento estaba ocurriendo, se podría establecer algún tipo de condicional para evitar que las consultas suceda

De esta manera, , que sería capaz de mantener el usuario sea capaz de desplazarse en el cuadro combinado, sino también ser capaz de prevenir las consultas suceda

1

Si subclase del control es posible (disculpas por la 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); 
    } 
} 
+0

Soy nuevo en C#. ¿Puedes decirme dónde usar esto para deshabilitar la barra scoll en el cuadro combinado? muestra garabatos rojos a 'SecurityPermission'. –

10

he encontrado una respuesta mezcla, poner 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 estado avanzado.

0

Combinando todas las respuestas en este hilo, la mejor solución si no desea crear un control personalizado es manejar el evento mousewheel. Lo siguiente también permitirá que la lista se dispare si se despliega.

Asumiendo que su cuadro combinado se llama ComboBox1:

If Not ComboBox1.DroppedDown Then 
    Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs) 
    mwe.Handled = True 
End If 
0

que tenían el mismo problema exacto, pero se encontró que el simple cambio del enfoque del control después de la consulta ejecutada a otro control como el botón "Consulta" en sí funcionó mejor que perfecto También me permitió desplazar el control hasta que SelectedIndex realmente cambió y solo había una línea de código.

0

Simplemente ponga esto en el evento mousewheel o en un solo controlador para todos los controles a los que se aplica, tal vez llamémoslo wheelsnubber. DirectCast (e, HandledMouseEventArgs) .Handled = True

Cuestiones relacionadas