Да, изменение фокуса во время события валидации довольно хлопотно.Событие возникает в то время, когда фокус меняется.Следующий элемент управления уже получил фокус в отношении Windows, но состояние логической формы все еще имеет фокус на проверяемом элементе управления.Когда вы устанавливаете для e.Cancel значение true, Winforms должен отменить состояние фокуса Windows.Когда вы этого не сделаете, он должен обновить логическое состояние после события.Существует множество факторов, которые могут пойти не так, когда вы сами измените фокус.
Важно дождаться, пока фокус не будет рассортирован.Лучше всего отложить ваш код, пока все не будет выполнено и форма снова не будет работать.Вы можете сделать это с помощью метода Control.BeginInvoke ().Как то так:
private delegate void ChangeFocusDelegate(Control ctl);
private void textBox1_Validating(object sender, CancelEventArgs e) {
int value;
if (!int.TryParse(textBox1.Text, out value)) e.Cancel = true;
else {
if (value == 1) this.BeginInvoke(new ChangeFocusDelegate(changeFocus), textBox2);
else this.BeginInvoke(new ChangeFocusDelegate(changeFocus), textBox3);
}
}
private void changeFocus(Control ctl) {
ctl.Focus();
}