質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

Q&A

0回答

1166閲覧

[Windows Forms] コンボボックスのリストを開いている時にメッセージボックスを表示するとSelectedIndexChangedが呼ばれるのはなぜですか?

sasa94

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

0グッド

0クリップ

投稿2020/06/17 01:38

編集2020/06/17 04:20

前提・実現したいこと

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

##補足
スタックオーバーフローでも似たような内容がありました。

「コンボボックスのドロップダウンメニューが閉じ、ユーザーが行ったコミットされていない選択を破棄することが起因している」とあります。
アンフォーカスでは破棄されず、メッセージボックスの表示で破棄されるのは何故でしょうか?

https://stackoverflow.com/questions/14760076/messagebox-show-causes-selected-value-to-be-reverted-during-combobox-selectionch

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/06/17 01:57

フォーカスが外れるので当然 SelectedIndexChanged は発生すると思います。発生しても問題ないように作ってください。
sasa94

2020/06/17 02:03

回答ありがとうございます。 すいません、記述が間違っていました。 ActiveControl = null によるコンボボックスのアンフォーカスでは呼ばれませんでしたが、ActiveControlはまた別なのですか? ファンクションキーを押したら別のコントロールにフォーカスが移るようにして、 SelectedIndexChanged が呼ばれるかテストしてみます。
YAmaGNZ

2020/06/17 02:15

何故そうなるのか調べきれていませんが、ダイアログを表示するとそのような動作となるようです。 別のコントロールへフォーカスを移した場合、別のフォームをShowした場合にはSelectedIndexChangedは発生しませんでした。
sasa94

2020/06/17 02:26 編集

YAmaGNZさん 回答ありがとうございます。 別のフォームをShowした場合の情報を教えていただき、ありがとうございます。 下記のスタックオーバーフローでは「コンボボックスの値が選択されていない状態で、強制的に閉じられることが原因」と書かれていました。 ダイアログの表示がなぜ起因しているのかも疑問です。 <https://stackoverflow.com/questions/14760076/messagebox-show-causes-selected-value-to-be-reverted-during-combobox-selectionch>
YAmaGNZ

2020/06/17 02:41

どのみち、SelectedIndexChangedイベント時に正常な選択がなされていない場合の考慮は必要でしょう。
sasa94

2020/06/17 04:02

YAmaGNZさん そうですね。 サブ画面のSelectedIndexChangedイベントに、非選択時の処理について変更を加えていこうと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問