禁用VB.NET中组合框的鼠标滚轮

9

有没有办法在控件(如组合框或列表框)获得焦点时禁用鼠标滚轮?对于我的需求,我只需要了解组合框的答案。

我已将组合框设置为在SelectedIndexChanged上触发SQL查询,并且当组合框获得焦点时意外滚动鼠标滚轮会导致大约六个SQL查询同时触发。

7个回答

16

我发现有不同的反应,将这段代码放在鼠标滚轮事件中:

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

就这些。如果你的项目已经处于高级阶段,就不需要创建新的类了。


1
好的答案。我使用了缩写版本:DirectCast(e, HandledMouseEventArgs).Handled = True - PKanold

10

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

请注意,这也会禁用下拉列表中的滚轮。


2
您可以检查ComboBox的DroppedDown属性,如果为True,则不设置EventArg的handled属性。这将使下拉列表显示时滚动轮继续工作。 - Jeras
如果你想将MouseWheel事件传递给ComboBox的父控件,在mwe.Handled = True之后,你可以调用Parent.Focus(或者一直调用Parent.Parent.Focus,直到到达一个可以获取焦点的控件,尽管这会变得混乱)。当包装在 If DroppedDown = False 中时,如果你不想ComboBox干扰父控件的滚动能力,这个方法非常有效。 - MCattle

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);
    }
}

我是C#的新手,你能告诉我在哪里使用它来禁用组合框上的滚动条吗?它显示了对“SecurityPermission”的红色波浪线。 - Mr_Green

0

其中一种选择是向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

以此方式,您将能够维护用户能够在组合框中滚动,同时也能够防止查询发生。

0

结合这个线程上所有的答案,如果您不想创建自定义控件,则最好的解决方案是处理鼠标滚轮事件。以下内容还将允许在下拉列表中滚动列表。

假设您的组合框被称为combobox1:

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

0

我遇到了完全相同的问题,但是发现在查询执行后将控件的焦点简单地转移到另一个控件(例如“查询”按钮)上比完美更好。这也使我能够滚动控件,直到SelectedIndex实际上改变,并且只需要一行代码。


0

只需将此代码放入鼠标滚轮事件或适用于所有相关控件的单个处理程序中,可以将其命名为wheelsnubber。 DirectCast(e, HandledMouseEventArgs).Handled = True


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接