c# - 用户输入验证和属性验证

标签 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;
    }
}

当我将此属性绑定(bind)到 "Text" TextBox 的属性(property)在 WinForm 应用程序中的控件中,用户输入的值将使用此规则进行验证,那么我如何才能捕获此异常并使用 ErrorProvider 显示它目的?

最佳答案

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

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
    }
}

您需要删除和添加处理程序,因为您正在手动编写控件的值。这将导致将值从数据源写回控件并再次引发此事件。所以,为了避免堆栈溢出,你需要这个技巧。

您可以为您拥有的所有数据绑定(bind)重用相同的事件处理程序:
foreach (Control control in Controls)
    foreach (Binding binding in control.DataBindings)
        binding.Parse += Binding_Parse;

关于c# - 用户输入验证和属性验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20322981/

相关文章:

scala - 如何验证 Spark Dataframe 的内容

java - PrimeFaces 日历接受无效日期作为输入

c# - SharpSVN.DLL - C#.NET - 在 Windows 应用程序中获取 SVN 存储库

c# - 在代码中使用 System.Data.OleDb 命名空间时找不到 OleDbConnection

c# - 禁用事件从其代码中自行触发

c# - 如何使用 C# 从 Windows 应用程序(非 Web)的系统托盘创建表单弹出窗口

c# - 更改在 UI 设计器中创建的控件的默认访问修饰符

php - 如何在验证 Controller 失败后启用提交按钮 - Laravel

c# - 文件传输协议(protocol)和 AS400

c# - 在 C# 中将颜色定义为常量