teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

スタックオーバーフローの内容を補足に追記

2020/06/17 04:20

投稿

sasa94
sasa94

スコア1

title CHANGED
File without changes
body CHANGED
@@ -11,8 +11,6 @@
11
11
 
12
12
  ### 発生している問題・エラーメッセージ
13
13
 
14
- SelectedIndexChangedが呼ばれることに不具合が発生しています。
15
-
16
14
  メイン画面から複数のサブ画面を呼び出しており、メイン画面はファンクションキーで共通処理を行います。
17
15
  共通処理でメッセージボックスを表示する機能があります。
18
16
 
@@ -21,16 +19,15 @@
21
19
 
22
20
  未選択状態 (SelectedIndex が -1)の時にコンボボックスを開き、そのままファンクションキー押下でメッセージボックスを表示した場合にエラーが発生しています。
23
21
 
24
- これは当時のテストケースにメッセージボックスの表示が含まれていなかったことが原因だと思いますが、今後を考えて原因を知りたいです。
25
22
 
26
23
  ###試したこと
27
24
 
28
- ActiveControl = null によるコンボボックスのアンフォーカスでは呼ばれませんでした。
25
+ コンボボックスのアンフォーカスでは、SelectedIndexChanged が呼ばれませんでした。
29
26
  コンボボックスのボタン押下イベントでファンクションキーを取得し、ドロップダウンリストを閉じることで一旦解決しました。
30
27
 
31
28
  しかし、メイン画面の共通処理は不完全で、サブ画面ごとに個別にファンクションキーの処理を変えている時もあります。
29
+ 今後もメイン画面の共通処理は変更される可能性があります。
32
30
 
33
-
34
31
  ### 原因が再現するソースコード
35
32
  新規 Windows Formに下記コードを貼り付けることで再現されます。
36
33
  コンボボックスを開いたまま F12を押すと"SelectedIndexChanged"が出力ウィンドウに表示されます。
@@ -55,7 +52,6 @@
55
52
 
56
53
  cb2.Location = new System.Drawing.Point(0, cb.Height + 10);
57
54
 
58
- cb2.Items.AddRange(new[] { "a", "b", "c" });
59
55
  cb2.SelectionChangeCommitted += (s, e) => Debug.WriteLine("SelectionChangeCommitted2");
60
56
  cb2.SelectedIndexChanged += (s, e) => Debug.WriteLine("SelectedIndexChanged2");
61
57
 
@@ -89,4 +85,12 @@
89
85
 
90
86
  ###開発環境
91
87
  Visual Studio 2015
92
- .Net Framework 2.0
88
+ .Net Framework 2.0
89
+
90
+ ##補足
91
+ スタックオーバーフローでも似たような内容がありました。
92
+
93
+ 「コンボボックスのドロップダウンメニューが閉じ、ユーザーが行ったコミットされていない選択を破棄することが起因している」とあります。
94
+ アンフォーカスでは破棄されず、メッセージボックスの表示で破棄されるのは何故でしょうか?
95
+
96
+ <https://stackoverflow.com/questions/14760076/messagebox-show-causes-selected-value-to-be-reverted-during-combobox-selectionch>

4

フォーカスの移動のコードを追加しました。

2020/06/17 04:20

投稿

sasa94
sasa94

スコア1

title CHANGED
File without changes
body CHANGED
@@ -35,6 +35,9 @@
35
35
  新規 Windows Formに下記コードを貼り付けることで再現されます。
36
36
  コンボボックスを開いたまま F12を押すと"SelectedIndexChanged"が出力ウィンドウに表示されます。
37
37
  リストの内容が空でも、表示されます。
38
+ F10でActiveControl = null によるコンボボックスのアンフォーカスをします。
39
+ F11で他のコンボボックスにフォーカスを移します。
40
+ F10,F11では"SelectedIndexChanged"が出力ウィンドウに表示されませんでした。
38
41
 
39
42
  ```c#
40
43
  public Form1()
@@ -48,11 +51,39 @@
48
51
  cb.SelectedIndexChanged += (s, e) => Debug.WriteLine("SelectedIndexChanged");
49
52
  //cb.PreviewKeyDown += (s, e) => { if (e.KeyCode == Keys.F12) cb.DroppedDown = false; }; //修正方法
50
53
 
54
+ ComboBox cb2 = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList };
55
+
56
+ cb2.Location = new System.Drawing.Point(0, cb.Height + 10);
57
+
58
+ cb2.Items.AddRange(new[] { "a", "b", "c" });
59
+ cb2.SelectionChangeCommitted += (s, e) => Debug.WriteLine("SelectionChangeCommitted2");
60
+ cb2.SelectedIndexChanged += (s, e) => Debug.WriteLine("SelectedIndexChanged2");
61
+
51
62
  Controls.Add(cb);
63
+ Controls.Add(cb2);
52
64
 
53
65
  KeyPreview = true;
66
+ KeyUp += (s, e) =>
67
+ {
68
+ switch(e.KeyCode)
69
+ {
70
+ case Keys.F10:
71
+ ActiveControl = null;
72
+ break;
73
+
74
+ case Keys.F11:
75
+ if (cb.Focused) cb2.Focus();
76
+ else cb.Focus();
77
+ break;
78
+
79
+ case Keys.F12:
54
- KeyUp += (s, e) => { if (e.KeyCode == Keys.F12) MessageBox.Show(""); };
80
+ MessageBox.Show("");
81
+ break;
82
+
55
- //KeyUp += (s, e) => { if (e.KeyCode == Keys.F12) ActiveControl = null; };
83
+ default:
84
+ break;
85
+ }
86
+ };
56
87
  }
57
88
  ```
58
89
 

3

アンフォーカスの修正

2020/06/17 02:17

投稿

sasa94
sasa94

スコア1

title CHANGED
@@ -1,1 +1,1 @@
1
- [Windows Form] コンボボックスのリストを開いている時にメッセージボックスを表示するとSelectedIndexChangedが呼ばれるのはなぜですか?
1
+ [Windows Forms] コンボボックスのリストを開いている時にメッセージボックスを表示するとSelectedIndexChangedが呼ばれるのはなぜですか?
body CHANGED
@@ -25,7 +25,7 @@
25
25
 
26
26
  ###試したこと
27
27
 
28
- ActiveControl = null によるコンボボックスのフォーカスでは呼ばれませんでした。
28
+ ActiveControl = null によるコンボボックスのアンフォーカスでは呼ばれませんでした。
29
29
  コンボボックスのボタン押下イベントでファンクションキーを取得し、ドロップダウンリストを閉じることで一旦解決しました。
30
30
 
31
31
  しかし、メイン画面の共通処理は不完全で、サブ画面ごとに個別にファンクションキーの処理を変えている時もあります。

2

タグを変更

2020/06/17 02:00

投稿

sasa94
sasa94

スコア1

title CHANGED
File without changes
body CHANGED
File without changes

1

ソースコードの説明を追記

2020/06/17 01:54

投稿

sasa94
sasa94

スコア1

title CHANGED
File without changes
body CHANGED
@@ -32,6 +32,9 @@
32
32
 
33
33
 
34
34
  ### 原因が再現するソースコード
35
+ 新規 Windows Formに下記コードを貼り付けることで再現されます。
36
+ コンボボックスを開いたまま F12を押すと"SelectedIndexChanged"が出力ウィンドウに表示されます。
37
+ リストの内容が空でも、表示されます。
35
38
 
36
39
  ```c#
37
40
  public Form1()
@@ -44,6 +47,7 @@
44
47
 
45
48
  cb.SelectedIndexChanged += (s, e) => Debug.WriteLine("SelectedIndexChanged");
46
49
  //cb.PreviewKeyDown += (s, e) => { if (e.KeyCode == Keys.F12) cb.DroppedDown = false; }; //修正方法
50
+
47
51
  Controls.Add(cb);
48
52
 
49
53
  KeyPreview = true;