前提・実現したいこと
TextBox の Validating イベントを直接呼び出したいのですが、
VBでのRaiseEventのようなことは出来ないでしょうか?
Invoke(textbox1.KeyDown) のように、登録されているだろうイベントを直接呼び出す方法を探しているのですが、
検索してもDelegateに登録して実行する等の結果ばかりでした。
該当のソースコード
c#
1public class CustomTextBox : TextBox { 2 protected override void OnValidating(CancelEventArgs e) { 3 // チェック処理 4 if (チェックエラー) { 5 MessageBox.Show("チェックエラーです"); 6 this.Focus(); // <- ここでチェック中以外のCustomTextBoxに元々フォーカスがあった場合、 7 // Validating 処理が走って、またチェックエラーメッセージを表示してしまうので、これを回避したい 8 e.Cancel = true; 9 } 10 } 11} 12 13// 14// CustomTextBox を沢山配置したフォーム 15// 16public class Form1 { 17 18 // 19 // このボタンクリックはForm上のどのコントロールにフォーカスが当たっていても 20 // ショートカットキーで呼び出すことが可能 21 // 22 private void button1_Click(object sender, EventArgs e) 23 { 24 ※現在フォーカスのあるCustomTextBox.Validateを実行; // これを実行して、ActiveControlのチェックを行いたい 25 if (上記※の結果、e.Cancel == true) { 26 処理終了; 27 } 28 29 if (フォーム上のCustomTextBoxのチェック処理 == 失敗) { 30 処理終了; 31 } 32 } 33} 34
試したこと
リフレクションで OnValidating を呼んでみましたが、実行された気配がありませんでした。
c#
1object[] args = { new CancelEventArgs() }; 2// OnValidating内でブレークポイントを張っていたが、止まらなかった。(呼ばれていない?) 3ActiveControl.GetType().InvokeMember("OnValidating", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, ActiveControl, args); 4 5var cea = args[0] as CancelEventArgs; 6if (cea.Cancel) // Cancel の中身は falseだった。 7{ 8 return; 9}
補足情報(FW/ツールのバージョンなど)
VisualStudio 2015
Windowsフォーム アプリケーション
.NET Framework 4.6.2
追記
button1_click() は、フォーム上のどのコントロールにフォーカスが当たっていても、
ショートカットキーで直接呼び出すことが可能です。
そのため以下の順で処理が走ります。
0. CustomTextBoxB上でショートカットキーを押す(KeyDown)
0. button1_click() の処理が走る
0. フォーム上のCustomTextBoxのチェック処理が走る
0. CustomTextBoxAのチェックが走って、「チェックエラーです」の後にフォーカスがCustomTextBoxAに移動する。
0. 4の時にCustomTextBoxBのLeaveイベントが起動し、OnValidatingが呼ばれる
5.のLeaveイベントを呼ばれる前に、CustomTextBoxBのOnValidatingを呼んで、
フォーム上のCustomTextBoxのチェック処理まで到達できないようにしたいのです。
追記2
Zuishinさんの指摘を受けて最終的にチェック処理が実装されていたら呼ぶようにしました。
c#
1public interface IValidator { 2 // 不正値かどうかの判定 3 // 不正値だった場合はメッセージを表示させて、コントロールにフォーカスを強制的に移動させる 4 bool ValidateInvalidValue(); 5} 6 7public class CustomTextBox : TextBox, IValidator { 8 protected override void OnValidating(CancelEventArgs e) { 9 if (ValidateInvalidValue()) return; 10 11 e.Cancel = true; 12 } 13 14 public bool ValidateInvalidValue() { 15 // チェック処理 16 if (チェックエラー) { 17 MessageBox.Show("チェックエラーです"); 18 this.Focus(); 19 return false; 20 } 21 return true; 22 } 23} 24 25// 26// CustomTextBox を沢山配置したフォーム 27// 28public class Form1 { 29 30 // 31 // このボタンクリックはForm上のどのコントロールにフォーカスが当たっていても 32 // ショートカットキーで呼び出すことが可能 33 // 34 private void button1_Click(object sender, EventArgs e) 35 { 36 var controls = 画面上のチェック対象コントロール全て; 37 if (CheckAllControls(controls)) { 38 return; 39 } 40 } 41 42 private bool CheckAllControls(List<Control> controls) { 43 // フォーカスの当たっているコントロールに不正な値が入っていないか確認 44 var validator = ActiveControl as IValidator; 45 if (validator != null) { 46 if(! validator.ValidateInvalidValue()) { 47 return false; 48 } 49 } 50 51 // 全体のチェック 52 } 53} 54

回答3件
あなたの回答
tips
プレビュー