【问题标题】:User input validation with validation on properties用户输入验证和属性验证
【发布时间】:2013-12-17 20:20:11
【问题描述】:

我在一个类中有一个 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 应用程序中 TextBox 控件的 "Text" 属性时,用户输入的值将使用此规则进行验证,那么我如何捕获此异常并使用 @987654325 显示它@对象?

【问题讨论】:

    标签: c# winforms validation exception error-handling


    【解决方案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;
    

    【讨论】:

    • @Masoud 设置控件绑定后。例如。在表单构造函数或Form_Load
    • 我在我的应用程序中使用了您的代码,但是在 Binding_Parse 完成后会触发 Name 属性的 Set 方法,因此 errorprovider 不会显示任何错误。 WriteValues() 不调用 Set of Name 属性!
    • @Masoud 如果您已正确指定绑定,则 WriteValues() 应将值从控件写入数据源的绑定属性。刚刚验证 - 对我来说很好。使用调试器查看事件处理程序中的绑定设置
    • 我刚刚使用了这个代码:Binding b = new Binding("Text", BsPerson, "Name", true); b.Parse += valueParameter_Parse;
    • 对不起,我的程序有另一个问题,我在另一个程序中测试你的代码,它工作正常。
    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 2011-06-09
    相关资源
    最近更新 更多