[C#]comboBoxでマウスホイールによる値の変更を禁止する

投稿日:

comboBoxってあるじゃないですか。
アレのお話。

勝手に値が変わってしまうコントロールがある

いや、勝手にじゃなく、操作の結果なんだけども・・・

という、こちらの理論は当然ながらお客さんには通じない訳で。

調査開始。

ComboBoxコントロールが原因だった

入力条件や、取得データで画面上の値が変わるような処理は当然ながら存在しない画面だというのは仕様から確定済み。

念のため、フォーム周りのソースでも確認したけど、そんな処理は存在しない。

 

じゃあ何が原因で値が変わる?

ということで、よくよくお客さんの話を聞いてみると・・・

ComboBoxコントロールばかりで発生しているとの事。
(ComboBoxとは認識していなかったけど、「▼のをクリックすると、下にビャーっと一覧が出て、そこから選ぶやつー」って感じで)

マウスホイールで値が変わってしまう

コンボボックスが選択された状態で、マウスホイールをクルクルっと変えたときに、値が変わってしまう訳で・・・

お客さんからしたら、いわゆる「何もしてない(プルダウンのリストから値を選択していない)」のに値が変わってしまっていた状態でした。

デスヨネー。

マウスホイールでの値変更をさせないようにする

慣れると、マウスで値を変更できるのは割りと便利なんだけど、慣れていないお客さんからしたら、いつ値が変わるのか分からないので使えたものじゃない・・・って感じなんでしょうね。

ということで、お客さんと相談し、マウスホイールでの値変更はできないように修正することに。

マウスホイールイベントは、そのままじゃ設定できない

プロパティ画面の、イベント一覧を見てみると・・・

無いんですよ。
MouseWheelってイベントが。

なので、VisualStudioのプロパティからは設定できません。

ただ、ネットで探すとMouseWheelイベント自体は存在するとのこと。

ComboBoxでマウスホイールでドロップダウンするのを無効にする方法

こちらのページとかを参考にしながら、処理を追加。

フォームへ配置した場合の記述方法

        //コンストラクタ
        public Form1()
        {
            InitializeComponent();
            this.comboBox1.MouseWheel += ComboBox1_MouseWheel;
        }

        /// 
<summary> マウスホイールスクロール発生時 </summary>

        /// <param name="sender">イベント呼び出し元オブジェクト</param>
        /// <param name="e">e</param>
        private void ComboBox1_MouseWheel(object sender, EventArgs e)
        {
            HandledMouseEventArgs wEventArgs = e as HandledMouseEventArgs;
            wEventArgs.Handled = true;
        }

こんな感じで、ComboBox1_MouseWheelイベントを新たに追加します。

赤字が新規で追加した部分。

ただ、コレだとComboBoxコントロール1個ずつに設定しなきゃいけないのが面倒くさい・・・のかな。

複数のコンボボックスがある画面なら、フォームに対してのマウスホイールイベントを作成して、コントロール毎に分岐とかかな。
こんな感じで。

        //コンストラクタ
        public Form1()
        {
            InitializeComponent();
            this.MouseWheel += Form1_MouseWheel;
        }

        /// 
<summary> マウスホイールスクロール発生時 </summary>

        /// <param name="sender">イベント呼び出し元オブジェクト</param>
        /// <param name="e">e</param>
        private void Form1_MouseWheel(object sender, EventArgs e)
        {
            if (comboBox1.Focused)
            {
                HandledMouseEventArgs wEventArgs = e as HandledMouseEventArgs;
                wEventArgs.Handled = true;
            }
        }

カスタムコントロールの記述方法

        //マウスホイールイベント
        protected override void OnMouseWheel(MouseEventArgs e)
        {
            base.OnMouseWheel(e);
            
            HandledMouseEventArgs wEventArgs = e as HandledMouseEventArgs;
            wEventArgs.Handled = true;
        }

カスタムコントロールとして作成すれば、個別判定を行う必要も無いので、楽ですw

ただ、当然ながらカスタムコントロールを使用した項目全てがマウスホイール無効になるので、そこだけ注意かな。

画面にチェックボックスでも用意して、マウスホイールの有効/無効を切替させるとかなら、手軽に出来るかな~w

まとめ

修正案を検討しながら、「プロパティ一個だから、すぐに出来ますわ~」って回答したものの、思ったより時間がかかってしまった案件だった。

結局、他の画面にも波及する話になっちゃったので、修正テストは多数発生して泣きそうですがw

カスタムコントロールを使っていれば、全画面の同一コントロールは全て適用になるので、テストも1画面だけやっとけばいいのですけどね・・・







-C#, 開発メモ
-,

関連記事

TortiseSVNなんだけど、自分が原因で「already locked」が出てしまった時の対処法。自分がロックを取ってて、ロックが取れずコミットが出来ない事態に遭遇した・・・

SVNを使っていると、たまにありますね。 ロックが既に誰かに取得されていて、コミットしようとした時に、唖然とするやつ。 ただ、今回は状況が違いました。 いつもなら、「ロック取ってるやつ誰だよ~」って感 …

[C#]文字を繰り返したものを取得したい。

いちいちfor文とかで繰り返すのも効率が悪いなと思ってたので、処理を関数化・・・ ただ、共通関数として登録しないので、別のところで使いたい場合は、同じ関数が複数登録されちゃうことに・・・ 更には、思い …

[Windows]タスクバーに表示される「最近使ったもの」が多すぎて消せないので、一括削除する方法

さて、Windows使いの人なら、地味に便利に使っている・・・かもしれない「最近使ったもの」という一覧。 確かに、同じフォルダを開きたい時とかは重宝します。 が、たまにウザいw 場合によっては消さなき …

no image

[Xcode]C#とは違うエラーキャッチ方法

先日から、Swiftの勉強をしているわけですが、未だに仕事でメインで使っているC#との違いで戸惑うことがちらほらと。 repeat文なんて、VBやC#じゃ見ないよな。forやwhile文が対応してるけ …

[ORACLE]ORA-24344:正常に終了しましたが、コンパイル・エラーがあります。

全然、正常に終われてねぇんじゃん?? って思った。 ビューの作成時に発生。 ネットで検索するも、明確な回答は見当たらず・・・ ただ、エラーには違いないので、ビューが正しく作成されていないことになる。 …


カテゴリー