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

質問編集履歴

2

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

2019/06/14 01:17

投稿

tec
tec

スコア9

title CHANGED
File without changes
body CHANGED
@@ -75,4 +75,64 @@
75
75
  0. 4の時にCustomTextBox**B**のLeaveイベントが起動し、OnValidatingが呼ばれる
76
76
 
77
77
  5.のLeaveイベントを呼ばれる前に、CustomTextBox**B**のOnValidatingを呼んで、
78
- フォーム上のCustomTextBoxのチェック処理まで到達できないようにしたいのです。
78
+ フォーム上のCustomTextBoxのチェック処理まで到達できないようにしたいのです。
79
+
80
+ ### 追記2
81
+ Zuishinさんの指摘を受けて最終的にチェック処理が実装されていたら呼ぶようにしました。
82
+
83
+ ```c#
84
+ public interface IValidator {
85
+ // 不正値かどうかの判定
86
+ // 不正値だった場合はメッセージを表示させて、コントロールにフォーカスを強制的に移動させる
87
+ bool ValidateInvalidValue();
88
+ }
89
+
90
+ public class CustomTextBox : TextBox, IValidator {
91
+ protected override void OnValidating(CancelEventArgs e) {
92
+ if (ValidateInvalidValue()) return;
93
+
94
+ e.Cancel = true;
95
+ }
96
+
97
+ public bool ValidateInvalidValue() {
98
+ // チェック処理
99
+ if (チェックエラー) {
100
+ MessageBox.Show("チェックエラーです");
101
+ this.Focus();
102
+ return false;
103
+ }
104
+ return true;
105
+ }
106
+ }
107
+
108
+ //
109
+ // CustomTextBox を沢山配置したフォーム
110
+ //
111
+ public class Form1 {
112
+
113
+ //
114
+ // このボタンクリックはForm上のどのコントロールにフォーカスが当たっていても
115
+ // ショートカットキーで呼び出すことが可能
116
+ //
117
+ private void button1_Click(object sender, EventArgs e)
118
+ {
119
+ var controls = 画面上のチェック対象コントロール全て;
120
+ if (CheckAllControls(controls)) {
121
+ return;
122
+ }
123
+ }
124
+
125
+ private bool CheckAllControls(List<Control> controls) {
126
+ // フォーカスの当たっているコントロールに不正な値が入っていないか確認
127
+ var validator = ActiveControl as IValidator;
128
+ if (validator != null) {
129
+ if(! validator.ValidateInvalidValue()) {
130
+ return false;
131
+ }
132
+ }
133
+
134
+ // 全体のチェック
135
+ }
136
+ }
137
+
138
+ ```

1

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

2019/06/14 01:17

投稿

tec
tec

スコア9

title CHANGED
File without changes
body CHANGED
@@ -24,6 +24,11 @@
24
24
  // CustomTextBox を沢山配置したフォーム
25
25
  //
26
26
  public class Form1 {
27
+
28
+ //
29
+ // このボタンクリックはForm上のどのコントロールにフォーカスが当たっていても
30
+ // ショートカットキーで呼び出すことが可能
31
+ //
27
32
  private void button1_Click(object sender, EventArgs e)
28
33
  {
29
34
  ※現在フォーカスのあるCustomTextBox.Validateを実行; // これを実行して、ActiveControlのチェックを行いたい
@@ -56,4 +61,18 @@
56
61
  ### 補足情報(FW/ツールのバージョンなど)
57
62
  VisualStudio 2015
58
63
  Windowsフォーム アプリケーション
59
- .NET Framework 4.6.2
64
+ .NET Framework 4.6.2
65
+
66
+ ---
67
+ ### 追記
68
+ button1_click() は、フォーム上のどのコントロールにフォーカスが当たっていても、
69
+ ショートカットキーで直接呼び出すことが可能です。
70
+ そのため以下の順で処理が走ります。
71
+ 0. CustomTextBox**B**上でショートカットキーを押す(KeyDown)
72
+ 0. button1_click() の処理が走る
73
+ 0. フォーム上のCustomTextBoxのチェック処理が走る
74
+ 0. CustomTextBox**A**のチェックが走って、「チェックエラーです」の後にフォーカスがCustomTextBox**A**に移動する。
75
+ 0. 4の時にCustomTextBox**B**のLeaveイベントが起動し、OnValidatingが呼ばれる
76
+
77
+ 5.のLeaveイベントを呼ばれる前に、CustomTextBox**B**のOnValidatingを呼んで、
78
+ フォーム上のCustomTextBoxのチェック処理まで到達できないようにしたいのです。