Отключить колесо прокрутки мыши в Combobox vb.net
-
24-10-2019 - |
Вопрос
Кто -нибудь знает способ отключения колеса прокрутки мыши, когда контроль, такой как Combobox или Listbox, фокусируется? Для моих целей Combobox - это все, что мне нужен ответ.
У меня есть ComboBox, установленный для запуска SQL -запроса на SelectedIndExchanged, и случайно прокручивая колесо, в то время как ComboBox имеет фокус, приводит к одновременному выстрелу около шести запросов SQL.
Решение
Combobox Control не позволяет вам легко переопределять поведение события мышиного колеса. Добавьте новый класс в свой проект и вставьте код, показанный ниже. Компиляция. Оставьте новый элемент управления из верхней части набора инструментов на свою форму.
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
Остерегайтесь, что это также отключает колесо в раскрывающемся списке.
Другие советы
Я нашел ответ микса, поместите этот код в событие мышиного колеса:
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, и в этом комбо -компокс разрешайте ситуацию. Я не уверен, как настроен ваш код, но я предполагаю, что если вы знаете, когда происходит событие, вы могли бы настроить какой -то условное, чтобы предотвратить проведение запросов
'''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, но также сможете предотвратить проведение запросов
Сочетание всех ответов в этом потоке, лучшее решение, если вы не хотите создавать пользовательский элемент управления, - это обрабатывать событие мышиного колеса. Ниже также позволит прокрутить список, если он будет отброшен.
Предполагая, что ваш ComboBox называется ComboBox1:
If Not ComboBox1.DroppedDown Then
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
End If
У меня была такая же проблема, но я обнаружил, что простое изменение фокуса управления после того, как запрос, выполненный на другой элемент управления, такой как кнопка «Запрос», сама по себе работала лучше, чем совершенство. Это также позволило мне по -прежнему прокрутить элемент управления до тех пор, пока SelectedIndex фактически не изменился и не стал только одной строкой кода.
Просто поместите это в событие мышиного колеса или в один обработчик для всех элементов управления, к которым применяются, возможно, назовите его Weelsnubber. DirectCast (e, обработчикам.