C# 用户输入验证和属性验证

C# 用户输入验证和属性验证,c#,winforms,validation,exception,error-handling,C#,Winforms,Validation,Exception,Error Handling,我在一个类中有一个Name属性,它包含一些验证: public string Name { get { return name; } set { if (! RegEx.IsMatch(value, "\w{1-35}")) throw new Exception("Name must be 1-35 alfanum"); this.name = value; } } 当我将此属性绑定到WinForm应用

我在一个类中有一个
Name
属性,它包含一些验证:

public string Name
{
    get { return name; }

    set 
    {
        if (! RegEx.IsMatch(value, "\w{1-35}"))
           throw new Exception("Name must be 1-35 alfanum");
        this.name = value;
    }
}

当我将此属性绑定到WinForm应用程序中
文本框
控件的
“Text”
属性时,用户输入的值将使用此规则进行验证,因此如何捕获此异常并使用
ErrorProvider
对象显示它?

在向控件添加绑定时,订阅它的事件(当数据绑定控件的值更改时发生):

然后在事件处理程序中执行以下操作:

void Binding_Parse(object sender, ConvertEventArgs e)
{
    var binding = (Binding)sender;
    try
    {
        binding.Parse -= Binding_Parse; // remove this event handler
        binding.WriteValue(); // try write control's value to data source
        errorProvider1.SetError(binding.Control, "");
    }
    catch (Exception error)
    {
        errorProvider1.SetError(binding.Control, error.Message);
    }
    finally
    {
        binding.Parse += Binding_Parse; // subscribe back
    }
}
您需要删除并添加处理程序,因为您正在手动写入控件的值。这将导致将值从数据源写入控件并再次引发此事件。因此,为了避免堆栈溢出,您需要此技巧

您可以对所有数据绑定重用相同的事件处理程序:

foreach (Control control in Controls)
    foreach (Binding binding in control.DataBindings)
        binding.Parse += Binding_Parse;

@设置控件绑定后重新启动。例如,在窗体构造函数中或在
form\u Load
上,我在应用程序中使用了您的代码,但在绑定解析完成后,会触发Set-method-of-Name属性,因此,errorprovider不会显示任何错误。writeValue()不调用Name属性集!@Masoud如果您已正确指定绑定,则
WriteValues()
应将控件中的值写入数据源的绑定属性。刚刚验证-对我来说工作正常。使用调试器查看事件句柄中的绑定设置我刚才使用了以下代码:
binding b=new binding(“Text”,BsPerson,“Name”,true);b.Parse+=valueParameter_Parse;
对不起,我的程序有另一个问题,我在另一个程序中测试了您的代码,它工作正常。
foreach (Control control in Controls)
    foreach (Binding binding in control.DataBindings)
        binding.Parse += Binding_Parse;