Question

Quelqu'un sait-il d'un moyen de désactiver la molette de défilement de la souris lorsqu'un contrôle comme un combobox ou listbox a le focus? Pour mes besoins, ComboBox est tout ce que je besoin de la réponse pour.

J'ai un ensemble de combobox pour déclencher une requête SQL sur SelectedIndexChanged, et le défilement accidentellement la roue alors que le combobox a des causes sur les six requêtes discussion SQL pour tirer simultanément.

Était-ce utile?

La solution

Le contrôle ComboBox ne vous laissez pas passer outre facilement le comportement de l'événement MouseWheel. Ajouter une nouvelle classe à votre projet et collez le code ci-dessous. Compiler. Laissez tomber le nouveau contrôle de la partie supérieure 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 que cela désactive aussi la roue dans la liste déroulante.

Autres conseils

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 vous avez votre projet dans un état avancé.

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);
    }
}

Une telle option serait d'ajouter un gestionnaire à l'comboBox, et dans ce comboBox, 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

 '''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 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

La combinaison de toutes les réponses sur ce fil, 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 la liste également permettre à défilée si elle tombe vers le bas.

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

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 » se fonctionne mieux que parfait. Cela m'a permis aussi de faire défiler encore le contrôle jusqu'à ce que le SelectedIndex réellement changé et était une seule ligne de code.

Il suffit de mettre ce cela vaut pour, peut-être appeler wheelsnubber en cas mousewheel ou dans un seul gestionnaire pour toutes les commandes. DirectCast (e, HandledMouseEventArgs) .Handled = True

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top