有谁知道当组合框或列表框等控件具有焦点时禁用鼠标滚轮的方法?就我的目的而言,组合框就是我所需要的答案。
我设置了一个组合框来触发 SelectedIndexChanged 上的 SQL 查询,当组合框具有焦点时意外滚动滚轮会导致大约六个 SQL 查询同时触发。
我找到了一个混合响应,将此代码放入 MouseWheel 事件中:
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
仅此而已。如果您的项目处于高级状态,则不需要创建新类。
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
请注意,这也会禁用下拉列表中的滚轮。
如果您对控件进行子类化,这是可能的(对 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);
}
}
其中一个选项是向组合框添加一个处理程序,并在该组合框中解决该情况。我不确定您的代码是如何设置的,但我假设如果您知道事件何时发生,您可以设置某种条件来防止查询发生
'''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
通过这种方式,您可以保持用户能够在组合框中滚动,但也能够防止查询发生
结合此线程上的所有答案,如果您不想创建自定义控件,最好的解决方案是处理鼠标滚轮事件。如果下拉列表,下面还允许滚动列表。
假设您的组合框名为组合框1:
If Not ComboBox1.DroppedDown Then
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
End If
我遇到了完全相同的问题,但发现在执行查询后简单地将控件的焦点更改为另一个控件(例如“查询”按钮本身)效果比完美更好。它还允许我仍然滚动控件,直到 SelectedIndex 实际更改并且只有一行代码。
只需将其放在鼠标滚轮事件中或放在适用于此的所有控件的单个处理程序中,也许可以将其称为wheelsnubber。 DirectCast(e, HandledMouseEventArgs).Handled = True
我最初很挣扎,但想出了一个解决方案,在鼠标滚轮事件中将下拉样式更改为简单,根本不支持滚动,然后在鼠标单击和鼠标离开时将其样式重置回“dropdown”或“dropdownlist” ” - 就像魅力一样。 这是示例代码
Private Sub ComboBox_MouseWheel(sender As Object, e As MouseEventArgs) Handles ComboBox.MouseWheel
' Set style to 'Simple' which doesn't support scrolling, preventing the selection from changing accidentally if mouse is hovering over the ComboBox
ComboBox.DropDownStyle = ComboBoxStyle.Simple
End Sub
Private Sub ComboBox_MouseDown(sender As Object, e As MouseEventArgs) Handles ComboBox.MouseDown
' Set style back to 'DropDownList' and automatically drop it down, to revert changes potentially made by MouseWheel event
ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
ComboBox.DroppedDown = True
End Sub
Private Sub ComboBox_MouseLeave(sender As Object, e As EventArgs) Handles ComboBox.MouseLeave
' Ensures the UI goes back to how it should be visually
ComboBox.DropDownStyle = ComboBoxStyle.DropDownList
End Sub
但是,这个解决方案是最好的,如上所述:
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
我称之为“Ronsil 解决方案” - 完全按照罐头上的说明进行操作!