フォームに貼り付けたコントロールのValidatingイベントハンドラ内で
if(!this.CauseValidation && this.ActiveControl == 元のコントロール) { return; } if (!this.ActiveControl.CausesValidation) { return; }
とする。
×ボタンで閉じる時は、元のコントロールがアクティブなままなので、ActiveControlが元のコントロールだったら抜ける。
本来、ActiveControlのCauseValidationがfalseの時は、Validatingイベントが発生しないはずなので、Validatingイベント内で、ActiveControlのCauseValidationがfalseである事を確認したらreturnで抜ける。
カスタムコントロールの実装時には、OnValidatingをオーバライドして、base.OnVvalidating()を呼ぶまえに
System.Windows.Forms.Control 親コントロール = this.Parent; while (親コントロール != null) { if (親コントロール is System.Windows.Forms.Form) { if (親コントロール.CausesValidation) { break; } if ((親コントロール as System.Windows.Forms.Form).ActiveControl == this) { return; } if (!(親コントロール as System.Windows.Forms.Form).ActiveControl.CausesValidation) { return; } } 親コントロール= 親コントロール.Parent; }
とする。
基本的には、フォームに貼り付けた場合と同じで、追加された実装はFormコントロールを見つけるまで親を遡る事。