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;