前提・実現したいこと
Windows Formで10年以上続くWindows Form アプリの開発・メンテナンスをしています。
開発経験は1年未満です。
コンボボックスのリストを開いている時にボタン押下などでメッセージボックスを表示すると、SelectedIndexChangedが呼ばれてしまいます。
原因は何か、知っている方がいらっしゃればご教授願いたいです。
開発環境は下記の通りで、変更はできません。
よろしくお願いします。
発生している問題・エラーメッセージ
メイン画面から複数のサブ画面を呼び出しており、メイン画面はファンクションキーで共通処理を行います。
共通処理でメッセージボックスを表示する機能があります。
サブ画面のいくつかはコンボボックスを持っています。
コンボボックスのSelectedIndexChangedでは、クラス内にある初期化フラグで処理を中断している実装になっています。
未選択状態 (SelectedIndex が -1)の時にコンボボックスを開き、そのままファンクションキー押下でメッセージボックスを表示した場合にエラーが発生しています。
###試したこと
コンボボックスのアンフォーカスでは、SelectedIndexChanged が呼ばれませんでした。
コンボボックスのボタン押下イベントでファンクションキーを取得し、ドロップダウンリストを閉じることで一旦解決しました。
しかし、メイン画面の共通処理は不完全で、サブ画面ごとに個別にファンクションキーの処理を変えている時もあります。
今後もメイン画面の共通処理は変更される可能性があります。
原因が再現するソースコード
新規 Windows Formに下記コードを貼り付けることで再現されます。
コンボボックスを開いたまま F12を押すと"SelectedIndexChanged"が出力ウィンドウに表示されます。
リストの内容が空でも、表示されます。
F10でActiveControl = null によるコンボボックスのアンフォーカスをします。
F11で他のコンボボックスにフォーカスを移します。
F10,F11では"SelectedIndexChanged"が出力ウィンドウに表示されませんでした。
c#
1public Form1() 2{ 3 InitializeComponent(); 4 5 ComboBox cb = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList }; 6 7 cb.Items.AddRange(new[] { "a", "b", "c" }); 8 9 cb.SelectedIndexChanged += (s, e) => Debug.WriteLine("SelectedIndexChanged"); 10 //cb.PreviewKeyDown += (s, e) => { if (e.KeyCode == Keys.F12) cb.DroppedDown = false; }; //修正方法 11 12 ComboBox cb2 = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList }; 13 14 cb2.Location = new System.Drawing.Point(0, cb.Height + 10); 15 16 cb2.SelectionChangeCommitted += (s, e) => Debug.WriteLine("SelectionChangeCommitted2"); 17 cb2.SelectedIndexChanged += (s, e) => Debug.WriteLine("SelectedIndexChanged2"); 18 19 Controls.Add(cb); 20 Controls.Add(cb2); 21 22 KeyPreview = true; 23 KeyUp += (s, e) => 24 { 25 switch(e.KeyCode) 26 { 27 case Keys.F10: 28 ActiveControl = null; 29 break; 30 31 case Keys.F11: 32 if (cb.Focused) cb2.Focus(); 33 else cb.Focus(); 34 break; 35 36 case Keys.F12: 37 MessageBox.Show(""); 38 break; 39 40 default: 41 break; 42 } 43 }; 44}
###開発環境
Visual Studio 2015
.Net Framework 2.0
##補足
スタックオーバーフローでも似たような内容がありました。
「コンボボックスのドロップダウンメニューが閉じ、ユーザーが行ったコミットされていない選択を破棄することが起因している」とあります。
アンフォーカスでは破棄されず、メッセージボックスの表示で破棄されるのは何故でしょうか?
あなたの回答
tips
プレビュー