代码之家  ›  专栏  ›  技术社区  ›  Caleb Hearth

禁用组合框vb.net中的鼠标滚轮

  •  9
  • Caleb Hearth  · 技术社区  · 14 年前

    当控件(如组合框或列表框)具有焦点时,是否有人知道禁用鼠标滚轮的方法?为了我的目的,组合框是我需要的答案。

    我设置了一个组合框来触发selectedIndexChanged上的SQL查询,当组合框聚焦时不小心滚动滚轮会导致大约六个SQL查询同时触发。

    7 回复  |  直到 9 年前
        1
  •  9
  •   Hans Passant    14 年前

    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
  •  14
  •   Jaime Bedmar    12 年前

    我发现了一个混合响应,将此代码放到mousewheel事件中:

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

    这就是全部。如果项目处于高级状态,则不需要创建新类。

        3
  •  1
  •   stuartd saeed    14 年前

    如果您对控件进行子类化,这是可能的(为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);
        }
    }
    
        4
  •  0
  •   AndyPerfect    14 年前

    一个这样的选项是向组合框中添加一个处理程序,并在该组合框中解决这种情况。我不确定如何设置代码,但我假设如果您知道事件发生的时间,可以设置某种条件来防止查询发生。

     '''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
    

    这样,您就可以保持用户能够在组合框中滚动,同时也可以防止查询发生。

        5
  •  0
  •   Tim    11 年前

    结合此线程上的所有答案,如果不想创建自定义控件,最好的解决方案是处理mousewheel事件。如果下拉列表,下面的内容也允许滚动列表。

    假设您的组合框称为组合框1:

    If Not ComboBox1.DroppedDown Then
      Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
      mwe.Handled = True
    End If
    
        6
  •  0
  •   Aaron Koehler    11 年前

    我也遇到过同样的问题,但发现在执行查询后简单地将控件的焦点更改为另一个控件(如“查询”按钮本身)比Perfect效果更好。它还允许我继续滚动控件,直到selectedIndex实际发生更改,并且只是一行代码。

        7
  •  0
  •   stentor    9 年前

    把它放在mousewheel事件中,或者放在一个单独的处理程序中,用于所有适用的控件,可以称之为wheelpubper。 DirectCast(e,handledMouseEventArgs).handled=true