在验证失败时突出显示绑定控制
本文关键字:显示 绑定 控制 验证 失败 | 更新日期: 2023-09-27 18:03:29
如何在验证失败时突出显示绑定的TextBox
(即:BackColor
) ?
换句话说,我想要这样的内容:
private void myTextBox_AfterCheckingValidation( object sender, EventArgs e )
{ // Which event would this be?
if ( theValidationFailed ) // <-- how do i get this?
myTextBox.BackColor = Color.Red;
else
myTextBox.BackColor = Color.Empty;
}
…或者是
private void myTextBox_TextChanged(object sender, EventArgs e)
{
bool vStatus = myTextBox.Validate(); // <-- How could I acheive this?
if (vStatus)
myTextBox.BackColor = Color.Red;
else
myTextBox.BackColor = Color.Empty;
}
指出:
- 由于
TextBox
被绑定,DataSet
执行验证检查。 - 表单
AutoValidate
属性是EnableAllowFocusChange
允许用户继续填写表单。 -
TextBox.Validating
事件发生在DataSet
执行数据验证之前,所以我不能在这里检查。 - 验证失败时不会发生
TextBox.Validated
事件,因此我不能在这里突出显示控件。 - 似乎没有
ValidationFailed
事件。
可能的(可能是坏的)方法:
- 在
TextBox.TextChanged
上,为表单调用this.Validate()
。但是,这会检查所有控件,而不仅仅是这个特定的控件。 - 为所有控件禁用
CausesValidation
。通过启用CausesValidation
并调用表单this.Validate()
方法,检查特定控件的有效性。这似乎太复杂了,不是一个合适的解决方案。 - 编写自己的验证检查。这似乎是多余和不必要的,因为它可能不会完全匹配
DataSet
数据验证。 - 在
TextBox.Validating
上设置一个短背景定时器。在TextBox.Validated
上取消定时器。在Timer.Expired
上,设置背景颜色。这种方法绝对是一个hack,但可能会完成工作。 - 使用
DataSet
,DataTable
,DataRow
或DataColumn
类型的方法显式检查验证?(…
我在网上搜索过了。我已经深入研究了TextBox
、DataSet
、BindingSource
和其他相关选项的方法、属性和事件。我完全不知道如何实现这样一个看似简单的任务。
你的问题是没有直接的位置来更新TextBox
的颜色。
实际的验证是由一些自动生成的代码完成的,因此大部分是不可访问的。有一个预验证事件&验证成功事件。(Validating
&Validated
)。但不是"Failed Validation"事件。
您提出的解决方案3 &4似乎最好。
对于3,您可以创建自己的验证器,并让它重用DataSet
的验证逻辑。这可能会很混乱,因为逻辑很难找到,而且您正在将验证与表示代码合并。
对于4,可以通过Validating
事件设置颜色为红色。(假设失败)。然后在Validated
事件中,将color设置为clear。这解决了主要问题,即没有明确的"Failed Validation"事件。(可能的缺点是,如果你需要执行"繁重"的任务。在这里,它只是一个属性更改,在验证完成之前,这应该不会导致重绘。
EDIT: Final Code (by Steven)
private void myTextBox_Validating(object sender, CancelEventArgs e)
{
myTextBox.BackColor = Color.Red;
}
private void weightTextBox_Validated(object sender, EventArgs e)
{
myTextBox.BackColor = Color.Empty;
}