Я создаю приложение базы данных Entity Framework (C #, SQL Server).Я использую поля текстового поля для нескольких дат, которые являются необязательными (DataTime? - обнуляемый).У меня есть проверяющие обработчики, которые отклоняют записи, которые не могут быть проанализированы как даты (DateTime.TryParse), но будут принимать пустые записи.Проблема в том, что если оставить поле пустым, поле текстового поля не позволит сместить фокус.Это происходит, даже если проверяющий обработчик утвердил его (e.cancel = false).Подтвержденное событие не срабатывает.Я не могу найти, откуда происходит эта недействительность за кулисами.
Я не могу использовать элемент управления DateTimePicker, потому что он, конечно, не может быть пустым и не может быть отформатирован так, чтобы соответствовать шрифту и цветам остальныхформы.
Дополнительная информация- Пользователь может проходить через эти поля (TAB) без остановки, если они не «касаются» их.В этом сценарии запускаются как события Validating, так и Validated.Однако, если какой-либо текст введен в поле (а затем удален), пользователь не может выйти из поля без ввода правильной даты.Событие Validating возникает, но не событие Validated.Никаких исключений не выдается, и никакие другие отзывы не предоставляются, пользователь просто застрял.
Дополнительная информация. Я обнаружил в форме свойство «AutoValidate» и попытался установить для него значение EnableAllowFocusChange;это позволяет пользователю выйти из пустого поля, но также позволяет ему выйти с неверной записью даты.Он также является глобальным для всей формы, что делает его неприемлемым (не) решением.
Откуда исходит эта скрытая первостепенная инвалидность и как я могу перехватить / отменить / победить ее?
MyКод проверки был запрошен:
private void txb_ReleaseDate_Validating(object sender, CancelEventArgs e)
{
if (!EditMode["EmployeeRecord"]) return; // NOT editing EmployeeRecord
TextBox dataField = (TextBox)sender;
Boolean isValid = true;
DateTime testValue;
if (!String.IsNullOrEmpty(dataField.Text)) // null is acceptable
{
isValid = DateTime.TryParse(dataField.Text, out testValue);
if (!isValid)
{
MessageBox.Show("Enter a valid Date for Release, or leave BLANK.", "Invalid Entry", MessageBoxButtons.OK);
e.Cancel = true;
}
}
}
private void txb_ReleaseDate_Validated(object sender, EventArgs e)
{
MessageBox.Show("Validated Handler (Release Date) fired");
}
Как я уже говорил, этот код выполняется как задумано.«Проверенный» код предназначен только для целей трассировки, и мне не нужно предпринимать никаких действий.
Что-то отменяет проверку записи после проверяющего кода, который был запущен и утвердил его..