using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HotelPms.SourceFactory { public partial class FormValid : Form { /// /// Validatingチェック&メッセージ表示攻略 /// ①CausesValidationItemを作成 /// ②終了ボタンのCausesValidation = falseでValidatingを一旦止める(※注意:フォーカスを離れると、Validatingは再度走る) /// ③WndProcで×ボタンを押した時に、Validatingを一旦止める仕掛け this.ActiveControl = 終了ボタン; /// ④FormValid_KeyDownを押した時に、Validatingを一旦止める仕掛け this.ActiveControl = 終了ボタン; /// ⑤全部Validatingの先頭に下記の追加(CausesValidation = falseで一旦止めたValidatingは再度走る防止するため) /// if (!CausesValidationItem(sender)) { return; } /// public FormValid() { InitializeComponent(); button1.CausesValidation = true; // button2.TabIndex = 0; button2.CausesValidation = false; //終了 } private bool CausesValidationItem(object sender) { return this.ActiveControl.CausesValidation; } private void textBox1_Validating(object sender, CancelEventArgs e) { if (!CausesValidationItem(sender)) { return; } MessageBox.Show("textBox1_Validating"); } private void textBox2_Validating(object sender, CancelEventArgs e) { if (!CausesValidationItem(sender)) { return; } //if (!this.CausesValidation) { return; } MessageBox.Show("textBox2_Validating"); } private void textBox3_Validating(object sender, CancelEventArgs e) { if (!CausesValidationItem(sender)) { return; } MessageBox.Show("textBox3_Validating"); } private void textBox4_Validating(object sender, CancelEventArgs e) { if (!CausesValidationItem(sender)) { return; } MessageBox.Show("textBox4_Validating"); } private void textBox5_Validating(object sender, CancelEventArgs e) { System.Diagnostics.Debug.WriteLine("Raise textBox5_Validating "); if (!CausesValidationItem(sender)) { return; } MessageBox.Show("textBox5_Validating"); } private void button2_Click(object sender, EventArgs e) { //Focus時、前のコントロールのValidatingを一旦止める this.Close(); //この時点、ボタンをフォーカスを離れるので、前のコントロールのValidatingを再度走る } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("button1_Click"); } private void FormValid_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.F1) { this.ActiveControl = button1; button1.PerformClick(); } else if (e.KeyCode == Keys.F12) { this.ActiveControl = button2; button2.PerformClick(); } } protected override void WndProc(ref Message m) { //Console.WriteLine(m.Msg); const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; if (m.Msg == WM_SYSCOMMAND && (int)m.WParam == SC_CLOSE) { //windowsの×ボタンを押すとき this.ActiveControl = button2; } base.WndProc(ref m); } private void FormValid_FormClosing(object sender, FormClosingEventArgs e) { //コントロールのValidatingの後 this.ActiveControl = button2; } private void textBox5_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) { switch(e.KeyCode) { case Keys.Tab: //enterや、tabでボタンへフォーカスする時、まだ終了していないので、チェックすることは望ましい textBox5_Validating(sender, new CancelEventArgs()); e.IsInputKey = false; break; } } private void textBox5_Enter(object sender, EventArgs e) { textBox5.BackColor = Color.Cyan; } private void textBox5_Leave(object sender, EventArgs e) { textBox5.BackColor = Color.White; } private void textBox4_Enter(object sender, EventArgs e) { textBox4.BackColor = Color.Cyan; } private void textBox4_Leave(object sender, EventArgs e) { textBox4.BackColor = Color.White; } private void textBox1_Enter(object sender, EventArgs e) { textBox1.BackColor = Color.Cyan; } private void textBox1_Leave(object sender, EventArgs e) { textBox1.BackColor = Color.White; } } }