2010-06-03 2 views
9

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

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

ответ

9

Элемент управления ComboBox не позволяет вам легко переопределить поведение MouseWhe el. Добавьте новый класс в свой проект и вставьте код, показанный ниже. Компиляция. Отбросьте новый элемент управления сверху панели инструментов на свою форму.

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 

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

+0

Это отлично работает. Благодарю. –

+2

Вы можете проверить свойство ComboBox [DroppedDown] (http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox.droppeddown.aspx) и не устанавливать свойство обработанного EventArg, если оно равно True , Это приведет к тому, что колесико прокрутки будет работать, когда появится раскрывающийся список. – Jeras

+0

Если вы хотите передать события MouseWheel в родительский элемент управления ComboBox, после 'mwe.Handled = True' вы можете вызвать' Parent.Focus' (или 'Parent.Parent.Focus', пока не достигнете элемента управления, который может сфокусироваться, хотя это будет беспорядочно). Когда он упакован в 'If DroppedDown = False', это работает очень хорошо, если вы не хотите, чтобы ComboBox мешал прокручиванию родительского элемента. – MCattle

0

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

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

1

Если подкласс управления возможно (извинения за 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

Я новичок в C#. не могли бы вы рассказать мне, где использовать это, чтобы отключить scollbar в combobox. он показывает красные каракули на «SecurityPermission». –

10

Я нашел ответ смеси, поместить этот код в случае MouseWheel:

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

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

0

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

Если предположить, что выпадающий называется ComboBox1:

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

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

0

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