Frage

Kennt jemand eine Möglichkeit, das Maus -Scroll -Rad zu deaktivieren, wenn eine Steuerung wie ein Combobox oder eine Listbox den Fokus hat? Für meine Zwecke ist Combobox alles, wofür ich die Antwort brauche.

Ich habe einen Combobox eingestellt, um eine SQL -Abfrage auf ausgewählterIndexchange auszulösen, und das Sachverlagern des Rades, während der Combobox einen Fokus hat, verursacht etwa sechs SQL -Abfragen, um gleichzeitig abzufeuern.

War es hilfreich?

Lösung

Mit der Combobox -Steuerung können Sie das Verhalten des Mausrad -Ereignisses nicht leicht überschreiben. Fügen Sie Ihrem Projekt eine neue Klasse hinzu und fügen Sie den unten gezeigten Code ein. Kompilieren. Lassen Sie das neue Steuerelement von oben auf der Toolbox auf Ihr Formular fallen.

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

Achten Sie darauf, dass dies auch das Rad in der Dropdown -Liste deaktiviert.

Andere Tipps

Ich habe eine Mix -Antwort gefunden, diesen Code in das Mausradereignis einfügt:

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

Das ist alles. Sie müssen keine neue Klasse erstellen, wenn Sie Ihr Projekt in einem fortgeschrittenen Zustand haben.

Wenn Sie die Kontrolle unterklassen, ist es möglich (Entschuldigung für das 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);
    }
}

Eine solche Option wäre, dem Combobox einen Handler hinzuzufügen und in diesem Combobox die Situation zu lösen. Ich bin mir nicht sicher, wie Ihr Code eingerichtet ist, aber ich gehe davon aus

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

Auf diese Weise können Sie in der Lage sein, den Benutzer in der Lage zu halten, im Combobox zu scrollen, aber auch in der Lage sein, zu verhindern, dass die Fragen auftreten

Wenn Sie alle Antworten in diesem Thread kombinieren, ist die beste Lösung, wenn Sie keine benutzerdefinierte Steuerung erstellen möchten, die Mausrad -Veranstaltung zu verarbeiten. Im Folgenden kann auch die Liste gescrollt werden, wenn sie fallen gelassen wird.

Angenommen, Ihr Combobox wird Combobox1 genannt:

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

Ich hatte genau das gleiche Problem, stellte jedoch fest, dass das Ändern des Fokus der Steuerung, nachdem die Abfrage an eine andere Steuerung wie die "Abfrage" -Taste selbst ausgeführt wurde, besser funktioniert als perfekt. Es ermöglichte mir auch, die Steuerung noch zu scrollen, bis sich der SelectedIndex tatsächlich änderte und nur eine Codezeile war.

Setzen Sie dies einfach in das Mausradereignis oder in einen einzigen Handler für alle Bedienelemente, auf die dies gelten, vielleicht als WheelNubber. DirectCast (E, HandledMouseeEventArgs). Handled = true

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top