有谁知道当组合框或列表框等控件具有焦点时禁用鼠标滚轮的方法?就我的目的而言,组合框就是我所需要的答案。

我设置了一个组合框来触发 SelectedIndexChanged 上的 SQL 查询,当组合框具有焦点时意外滚动滚轮会导致大约六个 SQL 查询同时触发。

有帮助吗?

解决方案

Combobox控件不能让您轻松覆盖鼠标轮的行为。在您的项目中添加新类,并粘贴下面显示的代码。编译。将新控件从工具箱的顶部放到您的表单上。

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中滚动,也可以防止查询发生

将此线程上的所有答案组合在一起,如果您不想创建自定义控件,则最好的解决方案是处理鼠标车事件。下面的列表也将滚动下来,如果将其放下。

假设您的组合称为Combobox1:

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

我遇到了完全相同的问题,但是发现在执行查询到另一个控件(例如“查询”按钮本身)之后,简单地更改控件的焦点,而不是完美。它还使我仍然可以滚动控件,直到SelectedIndex实际更改,并且仅是一行代码。

只需将其放在鼠标滚轮事件中或放在适用于此的所有控件的单个处理程序中,也许可以将其称为wheelsnubber。DirectCast(e, HandledMouseEventArgs).Handled = True

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top