Отключить колесо прокрутки мыши в выпадающем списке VB.NET - PullRequest
9 голосов
/ 03 июня 2010

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

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

Ответы [ 7 ]

14 голосов
/ 08 января 2013

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

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

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

10 голосов
/ 03 июня 2010

Элемент управления 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

Помните, что это также отключает колесо в раскрывающемся списке.

1 голос
/ 03 июня 2010

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

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

0 голосов
/ 27 декабря 2013

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

0 голосов
/ 14 декабря 2013

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

Предполагая, что ваш комбинированный список называется combobox1:

If Not ComboBox1.DroppedDown Then
  Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
  mwe.Handled = True
End If
0 голосов
/ 03 июня 2010

Один из таких вариантов - добавить обработчик в 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

Таким образом, вы сможете обеспечить пользователю возможность прокрутки в поле со списком, но также сможете предотвратить выполнение запросов

...