質問編集履歴

5

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

2020/06/17 04:20

投稿

sasa94
sasa94

スコア1

test CHANGED
File without changes
test CHANGED
@@ -24,10 +24,6 @@
24
24
 
25
25
 
26
26
 
27
- SelectedIndexChangedが呼ばれることに不具合が発生しています。
28
-
29
-
30
-
31
27
  メイン画面から複数のサブ画面を呼び出しており、メイン画面はファンクションキーで共通処理を行います。
32
28
 
33
29
  共通処理でメッセージボックスを表示する機能があります。
@@ -44,15 +40,13 @@
44
40
 
45
41
 
46
42
 
47
- これは当時のテストケースにメッセージボックスの表示が含まれていなかったことが原因だと思いますが、今後を考えて原因を知りたいです。
48
-
49
43
 
50
44
 
51
45
  ###試したこと
52
46
 
53
47
 
54
48
 
55
- ActiveControl = null によるコンボボックスのアンフォーカスでは呼ばれませんでした。
49
+ コンボボックスのアンフォーカスでは、SelectedIndexChanged が呼ばれませんでした。
56
50
 
57
51
  コンボボックスのボタン押下イベントでファンクションキーを取得し、ドロップダウンリストを閉じることで一旦解決しました。
58
52
 
@@ -60,7 +54,7 @@
60
54
 
61
55
  しかし、メイン画面の共通処理は不完全で、サブ画面ごとに個別にファンクションキーの処理を変えている時もあります。
62
56
 
63
-
57
+ 今後もメイン画面の共通処理は変更される可能性があります。
64
58
 
65
59
 
66
60
 
@@ -111,8 +105,6 @@
111
105
  cb2.Location = new System.Drawing.Point(0, cb.Height + 10);
112
106
 
113
107
 
114
-
115
- cb2.Items.AddRange(new[] { "a", "b", "c" });
116
108
 
117
109
  cb2.SelectionChangeCommitted += (s, e) => Debug.WriteLine("SelectionChangeCommitted2");
118
110
 
@@ -181,3 +173,19 @@
181
173
  Visual Studio 2015
182
174
 
183
175
  .Net Framework 2.0
176
+
177
+
178
+
179
+ ##補足
180
+
181
+ スタックオーバーフローでも似たような内容がありました。
182
+
183
+
184
+
185
+ 「コンボボックスのドロップダウンメニューが閉じ、ユーザーが行ったコミットされていない選択を破棄することが起因している」とあります。
186
+
187
+ アンフォーカスでは破棄されず、メッセージボックスの表示で破棄されるのは何故でしょうか?
188
+
189
+
190
+
191
+ <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

test CHANGED
File without changes
test CHANGED
@@ -72,6 +72,12 @@
72
72
 
73
73
  リストの内容が空でも、表示されます。
74
74
 
75
+ F10でActiveControl = null によるコンボボックスのアンフォーカスをします。
76
+
77
+ F11で他のコンボボックスにフォーカスを移します。
78
+
79
+ F10,F11では"SelectedIndexChanged"が出力ウィンドウに表示されませんでした。
80
+
75
81
 
76
82
 
77
83
  ```c#
@@ -98,15 +104,71 @@
98
104
 
99
105
 
100
106
 
107
+ ComboBox cb2 = new ComboBox { DropDownStyle = ComboBoxStyle.DropDownList };
108
+
109
+
110
+
111
+ cb2.Location = new System.Drawing.Point(0, cb.Height + 10);
112
+
113
+
114
+
115
+ cb2.Items.AddRange(new[] { "a", "b", "c" });
116
+
117
+ cb2.SelectionChangeCommitted += (s, e) => Debug.WriteLine("SelectionChangeCommitted2");
118
+
119
+ cb2.SelectedIndexChanged += (s, e) => Debug.WriteLine("SelectedIndexChanged2");
120
+
121
+
122
+
101
123
  Controls.Add(cb);
124
+
125
+ Controls.Add(cb2);
102
126
 
103
127
 
104
128
 
105
129
  KeyPreview = true;
106
130
 
107
- KeyUp += (s, e) => { if (e.KeyCode == Keys.F12) MessageBox.Show(""); };
131
+ KeyUp += (s, e) =>
108
132
 
133
+ {
134
+
135
+ switch(e.KeyCode)
136
+
137
+ {
138
+
139
+ case Keys.F10:
140
+
109
- //KeyUp += (s, e) => { if (e.KeyCode == Keys.F12) ActiveControl = null; };
141
+ ActiveControl = null;
142
+
143
+ break;
144
+
145
+
146
+
147
+ case Keys.F11:
148
+
149
+ if (cb.Focused) cb2.Focus();
150
+
151
+ else cb.Focus();
152
+
153
+ break;
154
+
155
+
156
+
157
+ case Keys.F12:
158
+
159
+ MessageBox.Show("");
160
+
161
+ break;
162
+
163
+
164
+
165
+ default:
166
+
167
+ break;
168
+
169
+ }
170
+
171
+ };
110
172
 
111
173
  }
112
174
 

3

アンフォーカスの修正

2020/06/17 02:17

投稿

sasa94
sasa94

スコア1

test CHANGED
@@ -1 +1 @@
1
- [Windows Form] コンボボックスのリストを開いている時にメッセージボックスを表示するとSelectedIndexChangedが呼ばれるのはなぜですか?
1
+ [Windows Forms] コンボボックスのリストを開いている時にメッセージボックスを表示するとSelectedIndexChangedが呼ばれるのはなぜですか?
test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
 
54
54
 
55
- ActiveControl = null によるコンボボックスのフォーカスでは呼ばれませんでした。
55
+ ActiveControl = null によるコンボボックスのアンフォーカスでは呼ばれませんでした。
56
56
 
57
57
  コンボボックスのボタン押下イベントでファンクションキーを取得し、ドロップダウンリストを閉じることで一旦解決しました。
58
58
 

2

タグを変更

2020/06/17 02:00

投稿

sasa94
sasa94

スコア1

test CHANGED
File without changes
test CHANGED
File without changes

1

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

2020/06/17 01:54

投稿

sasa94
sasa94

スコア1

test CHANGED
File without changes
test CHANGED
@@ -66,6 +66,12 @@
66
66
 
67
67
  ### 原因が再現するソースコード
68
68
 
69
+ 新規 Windows Formに下記コードを貼り付けることで再現されます。
70
+
71
+ コンボボックスを開いたまま F12を押すと"SelectedIndexChanged"が出力ウィンドウに表示されます。
72
+
73
+ リストの内容が空でも、表示されます。
74
+
69
75
 
70
76
 
71
77
  ```c#
@@ -90,6 +96,8 @@
90
96
 
91
97
  //cb.PreviewKeyDown += (s, e) => { if (e.KeyCode == Keys.F12) cb.DroppedDown = false; }; //修正方法
92
98
 
99
+
100
+
93
101
  Controls.Add(cb);
94
102
 
95
103