2010-06-03 25 views
9

Est-ce que quelqu'un connaît un moyen de désactiver la molette de la souris lorsqu'un contrôle tel qu'une zone de liste déroulante ou une zone de liste est actif? Pour mes fins, combobox est tout ce dont j'ai besoin pour la réponse.Désactiver la molette de la souris dans la zone de liste déroulante VB.NET

Je dispose d'un ensemble de commandes pour déclencher une requête SQL sur SelectedIndexChanged et le défilement accidentel de la roulette alors que la zone de liste déroulante est active provoque l'exécution simultanée de six requêtes SQL.

Répondre

9

Le contrôle ComboBox ne vous permet pas de remplacer facilement le comportement de la souris el événement. Ajoutez une nouvelle classe à votre projet et collez le code ci-dessous. Compiler. Déposez le nouveau contrôle du haut de la boîte à outils sur votre formulaire.

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 

Attention, cela désactive également la roue dans la liste déroulante.

+0

Cela fonctionne très bien. Merci. –

+2

Vous pouvez vérifier la propriété [DroppedDown] de la zone de liste déroulante (http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.droppeddown.aspx) et ne pas définir la propriété handle de l'EventArg si elle est True . Cela maintiendra la molette de défilement lorsque la liste déroulante est affichée. – Jeras

+0

Si vous voulez passer les événements MouseWheel au contrôle parent de ComboBox, après 'mwe.Handled = True' vous pouvez appeler' Parent.Focus' (ou 'Parent.Parent.Focus') jusqu'à ce que vous atteigniez un contrôle qui peut prendre le focus, bien que cela deviendra salissant). Lorsqu'il est enveloppé dans 'If DroppedDown = False', cela fonctionne plutôt bien lorsque vous ne voulez pas que ComboBox interfère avec la capacité de défilement d'un parent. – MCattle

0

Une telle option consisterait à ajouter un gestionnaire à la zone de liste déroulante et, dans cette zone de liste déroulante, à résoudre la situation. Je ne sais pas comment votre code est mis en place, mais je suppose que si vous saviez quand l'événement se produisait, vous pourriez mettre en place une sorte de condition pour éviter que les requêtes ne se produise

De cette façon , vous seriez en mesure de maintenir l'utilisateur pouvant faire défiler dans la liste déroulante, mais aussi être en mesure d'empêcher les requêtes de se produire

1

Si vous sous-classe le contrôle, il est possible (mes excuses pour le 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

Je suis nouveau sur C#. pouvez-vous s'il vous plaît dites-moi où l'utiliser pour désactiver le scollbar sur combobox. il montre des gribouillages rouges à 'SecurityPermission'. –

10

J'ai trouvé une réponse de mélange, mettre ce code en cas MouseWheel:

Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs) 
mwe.Handled = True 

C'est tout. Vous n'avez pas besoin de créer une nouvelle classe si votre projet est dans un état avancé.

0

En combinant toutes les réponses sur ce sujet, la meilleure solution si vous ne voulez pas créer un contrôle personnalisé est de gérer l'événement mousewheel. Le ci-dessous permettra également de faire défiler la liste si elle est déroulée.

En supposant que votre combobox est appelé ComboBox1:

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

J'ai eu exactement le même problème, mais a constaté que le simple changement au centre de contrôle après la requête exécutée à un autre contrôle, comme le bouton « Requête » lui-même travaillé mieux que parfait. Cela m'a également permis de faire défiler le contrôle jusqu'à ce que SelectedIndex change réellement et ne soit plus qu'une ligne de code.

0

Placez simplement ceci dans l'événement mousewheel ou dans un seul gestionnaire pour toutes les commandes auxquelles cela s'applique, appelez-le wheelnubber. DirectCast (e, HandledMouseEventArgs) .Handled = Vrai

Questions connexes