Отключить колесо прокрутки мыши в combobox VB.NET

кто-нибудь знает способ отключить колесо прокрутки мыши, когда элемент управления, такой как combobox или listbox имеет фокус? Для моих целей combobox-это все,что мне нужно.

У меня есть combobox, установленный для запуска SQL-запроса на SelectedIndexChanged, и случайная прокрутка колеса, в то время как combobox имеет фокус, вызывает около шести SQL-запросов одновременно.

7 ответов


элемент управления ComboBox не позволяет легко переопределить поведение события MouseWheel. Добавить новый класс в проект и вставьте код, приведенный ниже. Компилировать. Поместите новый элемент управления из верхней части панели инструментов в форму.

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

остерегайтесь, что это также отключает колесо в выпадающем списке.


Я нашел ответ mix, поместите этот код в событие MouseWheel:

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

вот и все. Вам не нужно создавать новый класс, если ваш проект находится в продвинутом состоянии.


Если вы подкласс элемента управления, это возможно (извинения за 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);
    }
}

одним из таких вариантов было бы добавить обработчик в comboBox и в этом comboBox разрешить ситуацию. Я не уверен, как настроен ваш код, но я предполагаю, что если бы вы знали, когда происходит событие, вы могли бы настроить какое-то условие, чтобы предотвратить запросы

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

таким образом, Вы сможете поддерживать возможность прокрутки пользователя в comboBox, но также сможете предотвратить запросы


объединяя все ответы в этом потоке, лучшим решением, если вы не хотите создавать пользовательский элемент управления, является обработка события mousewheel. Ниже также будет разрешено прокручивать список, если он выпадет.

предполагая, что ваш combobox называется combobox1:

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

У меня была точно такая же проблема, но я обнаружил, что простое изменение фокуса элемента управления после выполнения запроса на другой элемент управления, такой как кнопка "запрос", работало лучше, чем идеально. Это также позволило мне прокручивать элемент управления до тех пор, пока SelectedIndex фактически не изменился и не стал только одной строкой кода.


просто поместите это в событие mousewheel или в один обработчик для всех элементов управления, к которым это относится, возможно, назовите его wheelsnubber. DirectCast (e, HandledMouseEventArgs).Handled = True