1

我做了以下课程以避免重复 if else 代码,一次又一次:

public class Error 
{

    private ErrorProvider errProvider;


    public void SetError(Control control, string value)
    {

        errProvider = new ErrorProvider();

        if (control.Text.Trim().Length == 0)
        {
            errProvider.SetError(control, value);
        }
        else
        {
            errProvider.SetError(control, "");

        }

    }


}

文本框代码的验证是

private void textBox1_Validating(object sender, CancelEventArgs e)
    {

            erp.SetError(textBox1, "Please Enter Name");

    }
  1. 在texbox中输入文本后,当我按下回车键时,它工作正常;
  2. 没有在文本框中输入任何内容,当我按 Enter 时,它也可以正常工作意味着出现 Waring 红色图标;但
  3. 警告后,当我在文本框中输入文本后按 Tab 时, 警告图标不会消失,它应该被删除。

没有类它可以使用相同的代码正常工作

更新?

4

2 回答 2

2

使用字段初始化器

private readonly ErrorProvider errProvider = new ErrorProvider();

应该使用 Field Initializer errProvider,因为每次调用 Error.SetError 都会构造 ErrorProvider,构造的 ErrorProvider 不仅不会消失,而且只是分层。


[更新]

public class Error
{
    private readonly ErrorProvider errProvider = new ErrorProvider();
    public void SetError(Control control, string value)
    {

        if (control.Text.Trim().Length == 0)
        {
            errProvider.SetError(control, value);
        }
        else
        {
            errProvider.SetError(control, "");
        }
    }
}
于 2011-10-29T03:44:08.217 回答
0

ErrorProvider的构造移至声明行。所以改变:

private ErrorProvider errProvider;

到:

private ErrorProvider errProvider = new ErrorProvider(); 

并摆脱当前在您的SetError方法中的该成员的初始化。

向我们展示如何以及何时创建和存储对您正在使用的Error类实例的引用也可能很有用。

此外,将您的验证代码放在名为SetError的方法中有点误导(使您的代码更难维护)。我将其命名为ValidateControlHasValue或类似的名称。

于 2011-10-29T04:01:14.947 回答