如何只验证面板内的控件?

How can I validate only the controls inside a panel?

我有一个包含两个面板的表单,每个面板都有一个 [保存] 按钮。

如何分别验证每个面板内的所有控件?

我希望面板 class 有一个 Validate() 方法,但它没有。它也不是 ContainerControl,因此它也没有 ValidateChildren 方法。

完成此任务的最佳方法是什么?

如果您将表单的 AutoValidate 模式设置为 EnableAllowFocusChange,并且假设您已将验证事件连接到面板中的每个控件,则如下所示:

private void tb_Validating(object sender, CancelEventArgs e)
{
    TextBox tb = sender as TextBox;
    if (tb != null)
    {
        if (tb.Text == String.Empty)
        {
            errorProvider1.SetError(tb, "Textbox cannot be empty");
            e.Cancel = true;
        }
        else
            errorProvider1.SetError(tb, "");                    
    }
}

然后在保存按钮的 Click 处理程序上,您可以这样做:

private void SaveButton_Click(object sender, EventArgs e)
{
    foreach (Control c in panel1.Controls)
       c.Focus();
    // If you want to summarise the errors
    StringBuilder errorSummary = new StringBuilder();
    foreach (Control c in panel1.Controls){
        String error = errorProvider1.GetError(c);
        if (error != String.Empty) 
            errorSummary.AppendFormat("{0}{1}", errorProvider1.GetError(c), Environment.NewLine);
    }
    if(errorSummary.Length>0)
        MessageBox.Show(errorSummary.ToString());
}

这将导致验证在面板内的每个控件上触发。