質問編集履歴

2

目的を達成できたので、出来上がったコードを追記

2019/06/14 01:17

投稿

tec
tec

スコア9

test CHANGED
File without changes
test CHANGED
@@ -153,3 +153,123 @@
153
153
  5.のLeaveイベントを呼ばれる前に、CustomTextBox**B**のOnValidatingを呼んで、
154
154
 
155
155
  フォーム上のCustomTextBoxのチェック処理まで到達できないようにしたいのです。
156
+
157
+
158
+
159
+ ### 追記2
160
+
161
+ Zuishinさんの指摘を受けて最終的にチェック処理が実装されていたら呼ぶようにしました。
162
+
163
+
164
+
165
+ ```c#
166
+
167
+ public interface IValidator {
168
+
169
+ // 不正値かどうかの判定
170
+
171
+ // 不正値だった場合はメッセージを表示させて、コントロールにフォーカスを強制的に移動させる
172
+
173
+ bool ValidateInvalidValue();
174
+
175
+ }
176
+
177
+
178
+
179
+ public class CustomTextBox : TextBox, IValidator {
180
+
181
+ protected override void OnValidating(CancelEventArgs e) {
182
+
183
+ if (ValidateInvalidValue()) return;
184
+
185
+
186
+
187
+ e.Cancel = true;
188
+
189
+ }
190
+
191
+
192
+
193
+ public bool ValidateInvalidValue() {
194
+
195
+ // チェック処理
196
+
197
+ if (チェックエラー) {
198
+
199
+ MessageBox.Show("チェックエラーです");
200
+
201
+ this.Focus();
202
+
203
+ return false;
204
+
205
+ }
206
+
207
+ return true;
208
+
209
+ }
210
+
211
+ }
212
+
213
+
214
+
215
+ //
216
+
217
+ // CustomTextBox を沢山配置したフォーム
218
+
219
+ //
220
+
221
+ public class Form1 {
222
+
223
+
224
+
225
+ //
226
+
227
+ // このボタンクリックはForm上のどのコントロールにフォーカスが当たっていても
228
+
229
+ // ショートカットキーで呼び出すことが可能
230
+
231
+ //
232
+
233
+ private void button1_Click(object sender, EventArgs e)
234
+
235
+ {
236
+
237
+ var controls = 画面上のチェック対象コントロール全て;
238
+
239
+ if (CheckAllControls(controls)) {
240
+
241
+ return;
242
+
243
+ }
244
+
245
+ }
246
+
247
+
248
+
249
+ private bool CheckAllControls(List<Control> controls) {
250
+
251
+ // フォーカスの当たっているコントロールに不正な値が入っていないか確認
252
+
253
+ var validator = ActiveControl as IValidator;
254
+
255
+ if (validator != null) {
256
+
257
+ if(! validator.ValidateInvalidValue()) {
258
+
259
+ return false;
260
+
261
+ }
262
+
263
+ }
264
+
265
+
266
+
267
+ // 全体のチェック
268
+
269
+ }
270
+
271
+ }
272
+
273
+
274
+
275
+ ```

1

前提条件が足りなかったため追記

2019/06/14 01:17

投稿

tec
tec

スコア9

test CHANGED
File without changes
test CHANGED
@@ -49,6 +49,16 @@
49
49
  //
50
50
 
51
51
  public class Form1 {
52
+
53
+
54
+
55
+ //
56
+
57
+ // このボタンクリックはForm上のどのコントロールにフォーカスが当たっていても
58
+
59
+ // ショートカットキーで呼び出すことが可能
60
+
61
+ //
52
62
 
53
63
  private void button1_Click(object sender, EventArgs e)
54
64
 
@@ -115,3 +125,31 @@
115
125
  Windowsフォーム アプリケーション
116
126
 
117
127
  .NET Framework 4.6.2
128
+
129
+
130
+
131
+ ---
132
+
133
+ ### 追記
134
+
135
+ button1_click() は、フォーム上のどのコントロールにフォーカスが当たっていても、
136
+
137
+ ショートカットキーで直接呼び出すことが可能です。
138
+
139
+ そのため以下の順で処理が走ります。
140
+
141
+ 0. CustomTextBox**B**上でショートカットキーを押す(KeyDown)
142
+
143
+ 0. button1_click() の処理が走る
144
+
145
+ 0. フォーム上のCustomTextBoxのチェック処理が走る
146
+
147
+ 0. CustomTextBox**A**のチェックが走って、「チェックエラーです」の後にフォーカスがCustomTextBox**A**に移動する。
148
+
149
+ 0. 4の時にCustomTextBox**B**のLeaveイベントが起動し、OnValidatingが呼ばれる
150
+
151
+
152
+
153
+ 5.のLeaveイベントを呼ばれる前に、CustomTextBox**B**のOnValidatingを呼んで、
154
+
155
+ フォーム上のCustomTextBoxのチェック処理まで到達できないようにしたいのです。