在验证失败时突出显示绑定控制

本文关键字:显示 绑定 控制 验证 失败 | 更新日期: 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事件。

可能的(可能是坏的)方法:

  1. TextBox.TextChanged上,为表单调用this.Validate()。但是,这会检查所有控件,而不仅仅是这个特定的控件。
  2. 为所有控件禁用CausesValidation。通过启用CausesValidation并调用表单this.Validate()方法,检查特定控件的有效性。这似乎太复杂了,不是一个合适的解决方案。
  3. 编写自己的验证检查。这似乎是多余和不必要的,因为它可能不会完全匹配DataSet数据验证。
  4. TextBox.Validating上设置一个短背景定时器。在TextBox.Validated上取消定时器。在Timer.Expired上,设置背景颜色。这种方法绝对是一个hack,但可能会完成工作。
  5. 使用DataSet, DataTable, DataRowDataColumn类型的方法显式检查验证?(…

我在网上搜索过了。我已经深入研究了TextBoxDataSetBindingSource和其他相关选项的方法、属性和事件。我完全不知道如何实现这样一个看似简单的任务。

在验证失败时突出显示绑定控制

你的问题是没有直接的位置来更新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;
}