我正在构建一个Entity Framework数据库应用程序(C#,SQL Server)。我将文本框字段用于多个可选日期(DataTime?-可为空)。我有验证处理程序,该处理程序拒绝无法解析为日期的条目(DateTime.TryParse),但是将接受空白条目。问题在于,如果将条目保留为空白,则文本框字段将不允许焦点移开。即使Validating Handler批准了此操作(e.cancel = false)。已验证事件不会触发。我找不到后台失效的来源。
我不能使用DateTimePicker控件,因为它当然也不可以为空白-也不能对其进行格式化以匹配表单其余部分的字体和颜色。
其他信息-只要用户不“触摸”它们,便可以不停地通过这些字段(TAB)。在这种情况下,将同时触发Validating和Validated事件。但是,如果在该字段中输入了任何文本(然后删除了),则用户必须输入有效日期才能退出该字段。将触发Validating事件,但不会触发Validated事件。不会抛出异常,也不会给出任何其他反馈,只是使用户陷入困境。
其他信息-我在表单上找到“ AutoValidate”属性,并尝试将其设置为EnableAllowFocusChange;这允许用户退出空白字段,但也允许他们退出并输入无效的日期。它对于整个表单也是全局的,这使它成为不可接受的(非)解决方案。
这种隐藏的,无效的失效来自何处,我该如何拦截/取消/击败它?
已请求我的验证码:
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");
}
正如我提到的,此代码正在按预期执行。 “已验证”代码仅用于跟踪目的,我不需要在那里执行任何操作。
在验证代码运行并获得批准后,某项正在取消验证 项。