Domanda

Qualcuno sa di un modo per disattivare la rotellina di scorrimento del mouse quando un controllo, come una casella combinata o casella di riepilogo è attiva? Per i miei scopi, combobox è tutto quello che serve per la risposta.

Ho una serie combobox per innescare una query SQL su SelectedIndexChanged, e scorrendo accidentalmente la ruota, mentre la casella combinata ha cause di messa a fuoco di circa sei query SQL per sparare contemporaneamente.

È stato utile?

Soluzione

Il controllo ComboBox non consente di ignorare facilmente comportamento della manifestazione MouseWheel. Aggiungere una nuova classe al progetto e incollare il codice riportato di seguito. Compilare. Drop il nuovo controllo dalla parte superiore della casella degli strumenti nel form.

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

Attenzione che questo disabilita anche la ruota nell'elenco a discesa.

Altri suggerimenti

Ho trovato una risposta mix, inserire questo codice nell'evento MouseWheel:

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

Questo è tutto. Non è necessario creare una nuova classe, se avete il vostro progetto in uno stato avanzato.

Se si sottoclasse il controllo è possibile (scuse per il 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 delle ipotesi potrebbe essere quella di aggiungere un gestore alla comboBox, e all'interno di tale comboBox, risolvere la situazione. Io non sono sicuro di come il codice è impostato, ma sto assumendo se tu sapessi quando l'evento stava accadendo, si potrebbe creare una sorta di condizione per evitare le query accada

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

In questo modo, si sarebbe in grado di mantenere l'utente in grado di scorrere nella casella combinata, ma anche essere in grado di prevenire le query accada

La combinazione di tutte le risposte su questo thread, la soluzione migliore se non si desidera creare un controllo personalizzato è quello di gestire l'evento rotellina del mouse. Il sotto permetterà anche l'elenco per scorrere in caso di caduta verso il basso.

Assumendo che il combobox si chiama ComboBox1:

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

Ho avuto lo stesso problema esatta, ma ha scoperto che semplicemente cambiando il focus del controllo dopo che la query eseguita su un altro controllo ad esempio il pulsante "Query" per sé ha funzionato meglio che perfetto. Inoltre mi ha permesso di scorrere ancora il controllo fino al SelectedIndex effettivamente cambiato ed è stato solo una riga di codice.

Basta mettere questo in caso rotella del mouse o in un unico gestore per tutti i controlli questo vale per, forse chiamarlo wheelsnubber. DirectCast (e, HandledMouseEventArgs) .Handled = True

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top