我在一个类中有一个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"
控件的TextBox
属性时,用户输入的值将使用此规则进行验证,因此如何捕获此异常并显示它使用ErrorProvider
对象?
答案 0 :(得分:1)
向控件添加绑定时,订阅它的Parse
事件(当数据绑定控件的值发生更改时发生):
textBox1.DataBindings.Add("Text", person, "Name");
textBox1.DataBindings["Text"].Parse += Binding_Parse;
然后在事件处理程序中执行以下操作:
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;