コンボボックスvb.netでマウススクロールホイールを無効にします
-
24-10-2019 - |
質問
コンボボックスやリストボックスなどのコントロールが焦点を当てたときに、マウススクロールホイールを無効にする方法を知っていますか?私の目的のために、コンボボックスは答えが必要です。
SelectedIndexChangedでSQLクエリをトリガーするコンボボックスが設定されており、コンボボックスにフォーカスが焦点を当てている間に誤ってホイールをスクロールし、約6 SQLクエリを同時に発射します。
解決
コンボボックスコントロールにより、マウスホイールイベントの動作を簡単にオーバーライドできません。プロジェクトに新しいクラスを追加し、以下に示すコードを貼り付けます。コンパイル。ツールボックスの上部からフォームに新しいコントロールをドロップします。
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);
}
}
そのようなオプションの1つは、コンボボックスにハンドラーを追加し、そのコンボボックス内で状況を解決することです。あなたのコードがどのようにセットアップされているかはわかりませんが、イベントがいつ起こっているのか知っていれば、クエリが発生するのを防ぐために何らかの条件付きセットアップができると仮定しています
'''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
このようにして、ユーザーがコンボボックスでスクロールできることを維持できるだけでなく、クエリの発生を防ぐことができます
このスレッドのすべての回答を組み合わせることで、カスタムコントロールを作成したくない場合の最良の解決策は、マウスホイールイベントを処理することです。以下は、リストを落とした場合にスクロールすることもできます。
コンボボックスがcombobox1と呼ばれると仮定します。
If Not ComboBox1.DroppedDown Then
Dim mwe As HandledMouseEventArgs = DirectCast(e, HandledMouseEventArgs)
mwe.Handled = True
End If
まったく同じ問題がありましたが、クエリが「クエリ」ボタン自体がPerfectよりもうまく機能するなど、クエリが別のコントロールに実行された後にコントロールの焦点を変更するだけであることがわかりました。また、SelectedIndexが実際に変更され、コードの1行しかなくなるまで、コントロールをスクロールすることができました。
これをマウスホイールイベントまたはこれが適用されるすべてのコントロールのための単一のハンドラーに置くだけで、おそらくそれをWheelsnubberと呼んでください。 DirectCast(E、HandledMouseEventargs).Handled = true