C# - 验证时突出显示错误的控件

时间:2013-11-19 18:21:27

标签: c# winforms validation error-handling

我试图用try catch验证windows表单,到目前为止我成功了。我的目标是当有人忘记填补空白或输入错误的条目时,捕获返回消息框并发出警告。现在我对每个要验证的控件都有Validating事件,所以当有人将它留空或格式不正确时,它会在控件旁边显示错误。到目前为止似乎还不错(至少对我来说)但我的问题是,如果用户甚至没有点击一个框,它只显示消息框,但它不会突出显示错误的控件。

以下是我的代码:

private void createButton_Click(object sender, EventArgs e)
    {
        try
        {
            Book newBook = new Book(titleBox.Text, authBox.Text, Convert.ToInt32(yearBox.Text), Convert.ToInt32(editBox.Text), pubComboBox.Text, descBox.Text);
            bookList.Add(newBook);
            booklistListBox.DataSource = bookList;
        }
        catch (FormatException)
        {
            MessageBox.Show("You probably missed a gap or put in incorrect form");
        }

    }

以及那些验证事件:

 private void titleBox_Validating(object sender, CancelEventArgs e)
    {
         if (titleBox.Text.Trim() == String.Empty)
        {
            errorProvider.SetError(titleBox, "Title is required");
            e.Cancel = true;
        }
         else
        {
            errorProvider.SetError(titleBox, "");
        }
    }

    private void authBox_Validating(object sender, CancelEventArgs e)
    {
        if (authBox.Text.Trim() == String.Empty)
        {
            errorProvider.SetError(authBox, "Author is required");
            e.Cancel = true;
        }
        else
        {
            errorProvider.SetError(authBox, "");
        }
    }

    private void yearBox_Validating(object sender, CancelEventArgs e)
    {
        if (yearBox.Text.Trim() == String.Empty)
        {
            errorProvider.SetError(yearBox, "Year is required");
            e.Cancel = true;
        }
        else
        {
            errorProvider.SetError(yearBox, "");
        }
    }

    private void editBox_Validating(object sender, CancelEventArgs e)
    {
        if (editBox.Text.Trim() == String.Empty)
        {
            errorProvider.SetError(editBox, "Edition is required");
            e.Cancel = true;
        }
        else
        {
            errorProvider.SetError(editBox, "");
        }
    }

    private void pubComboBox_Validating(object sender, CancelEventArgs e)
    {
        if (pubComboBox.Text.Trim() == String.Empty)
        {
            errorProvider.SetError(pubComboBox, "Publisher is required");
            e.Cancel = true;
        }
        else
        {
            errorProvider.SetError(pubComboBox, "");
        }
    }

    private void descBox_Validating(object sender, CancelEventArgs e)
    {
        if (descBox.Text.Trim() == String.Empty)
        {
            errorProvider.SetError(descBox, "Description is required");
            e.Cancel = true;
        }
        else
        {
            errorProvider.SetError(descBox, "");
        }
    }

有没有办法,我不知道,改变焦点或类似的东西,强迫按下创建按钮? 谢谢

3 个答案:

答案 0 :(得分:0)

尝试使用ValidateChildren()

private void createButton_Click(object sender, EventArgs e)
{
     bool gotIssues = this.ValidateChildren();
     if (gotIssues) 
     {
         // someone didn't validate well...
     }
}

答案 1 :(得分:0)

所以,这里的问题是你想要在两种情况中突出显示它:

1)当您离开该字段并且其内容无效时(在这种情况下为空) 2)单击“创建”按钮时,相关字段的内容无效

所以我会创建一个textBox_checkIfEmpty(object sender, EventArgs e)方法:

private void textBox_checkIfEmpty(object sender, EventArgs e)
{
    var asTb = sender as TextBox;

    if (asTb != null && asTb.Text.Trim() == String.Empty)
    {
        errorProvider.SetError(asTb, "I'll leave it to you to abstract the error message appropriately");
        e.Cancel = true;
    }
    else
    {
        errorProvider.SetError(asTb, "");
    }
}

然后,您可以将此方法设置为所需所需控件上Validate事件的处理程序,也可以从创建按钮的处理程序中调用相同的方法,循环显示所需的TextBox实例并在每个实例上执行该方法。

<强>更新 J. Hudler的ValidateChildren解决方案将是一个更加(开发人员)有效的尾部,而不是循环通过所需的控件。也就是说,如果表单有很多子项,并且您只需要验证几个,那么循环可能会有所帮助。只取决于您的具体情况。我唯一的另一个问题是ValidateChildren是否是无限递归的,或者它是否只降低了一级(直接的孩子而不是所有的后代)。

答案 2 :(得分:0)

当鼠标单击控件然后将其从控件中保留时,验证控件调用的事件。在您没有单击控件的情况下,它不会触发验证事件。你可以通过创建自己的函数并在creat事件上调用它们来完成此操作。

private void button1_Click(object sender, EventArgs e)
    {

        textBox1_Validating(sender);
    }

    public void textBox1_Validating(object sender)
    {
        MessageBox.Show("validating");
        errorProvider1.SetError(textBox1, "provide");
    }