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画面だけやっとけばいいのですけどね・・・