C# 从绑定到DataGridView的对象列表捕获异常

C# 从绑定到DataGridView的对象列表捕获异常,c#,exception,datagridview,presentation-layer,C#,Exception,Datagridview,Presentation Layer,我正在从事一个项目,其中关注点分为3层(表示层、业务逻辑层和数据访问层)。使用异常冒泡,我可以将异常从一个层传递到另一个层,直到最终捕获它并显示来自表示层的消息。但是,每当在datagridview中更新单元格时,我不知道如何执行此操作 //Business entity: class Clients : Person { public override string FirstName { set { try

我正在从事一个项目,其中关注点分为3层(表示层、业务逻辑层和数据访问层)。使用异常冒泡,我可以将异常从一个层传递到另一个层,直到最终捕获它并显示来自表示层的消息。但是,每当在datagridview中更新单元格时,我不知道如何执行此操作

//Business entity:
class Clients : Person
{
    public override string FirstName
    {
        set
        {
            try
            {
                fc.lettersOnlyUpcaseFirstChar(ref value, false);
                dal.update(this.GetType().Name, "FirstName", value, "ClientID", clientID.ToString());
            }
            catch (Exception)
            {
                throw;
            }
        } 
    }
}

//Format checking helper class:
class formatChecks
{
    public void lettersOnlyUpcaseFirstChar(ref string input, bool nullable)
    {
        input = Regex.Replace(input, @"\s+", "");
        if (input == "" && !nullable)
            throw new ArgumentOutOfRangeException("Value can not be null.");
        if (!input.All(Char.IsLetter))
            throw new FormatException("Value may only contain letters (a-z, A-Z).");
        char[] letters = input.ToLower().ToCharArray();
        letters[0] = char.ToUpper(letters[0]);
        string outs = new string(letters);
    }
}

//Business layer helper class:
class BLHandler
{
    // initialize list of Clients by using a Data Access class...
    ArrClients = dal.selectAll("Clients", typeof(Clients).AssemblyQualifiedName).Cast<Clients>().ToList();
}

//The list bound to a datagridview in the presentation layer:
public frmMain()
{
    dgvCustomers.DataSource = BHandler.ArrClients;
}
//业务实体:
类别客户:个人
{
公共重写字符串名
{
设置
{
尝试
{
fc.lettersOnlyUpcaseFirstChar(参考值,false);
update(this.GetType().Name,“FirstName”,value,“ClientID”,ClientID.ToString());
}
捕获(例外)
{
投掷;
}
} 
}
}
//格式检查帮助程序类:
类格式检查
{
public void lettersOnlyUpcaseFirstChar(参考字符串输入,布尔值为空)
{
input=Regex.Replace(输入@“\s+”,“”);
如果(输入==“”&&!可为空)
抛出新ArgumentOutOfRangeException(“值不能为null”);
如果(!input.All(Char.isleter))
抛出新FormatException(“值只能包含字母(a-z,a-z)。”;
char[]字母=input.ToLower().ToCharArray();
字母[0]=char.ToUpper(字母[0]);
字符串输出=新字符串(字母);
}
}
//业务层助手类:
类BLHandler
{
//使用数据访问类初始化客户端列表。。。
ArrClients=dal.selectAll(“客户机”,typeof(客户机).AssemblyQualifiedName.Cast().ToList();
}
//绑定到表示层中datagridview的列表:
公共财政收入()
{
dgvCustomers.DataSource=BHandler.ArrClients;
}

我知道我可以在表示层进行格式检查,但我更愿意这样做。有什么方法可以让这个工作正常吗?

在哪里设置该属性?如果您尝试包装设置值的代码段,您应该会很好。每当我在DataGridView中更新值时,它都会自动为我更新绑定对象。因此,我不使用任何代码来设置值。也许尝试一下,您可能必须通过处理事件来处理DataGridView中的异常,因为您使用的是3层体系结构,这很好。我认为您的演示应该处理BLL(仅限),它处理DAL以获取所需的数据或抛出的异常。让BLL捕捉异常并将其传递给前端,以便对其进行处理。该属性在哪里设置?如果您尝试包装设置值的代码段,您应该会很好。每当我在DataGridView中更新值时,它都会自动为我更新绑定对象。因此,我不使用任何代码来设置值。也许尝试一下,您可能必须通过处理事件来处理DataGridView中的异常,因为您使用的是3层体系结构,这很好。我认为您的演示应该处理BLL(仅限),它处理DAL以获取所需的数据或抛出的异常。让BLL捕捉异常并将其传递给前端,以便对其进行处理。