从单独的类方法更新MainForm控件

时间:2009-09-05 03:10:56

标签: c# .net winforms

我有一个带有MainForm的简单应用程序,有时会打开第二个表单。我有一个数据访问层类.cs,并尝试了catch语句。在catch上我调用了另一个类方法logError。

由于logError可以被任何线程或2个表单调用,因此它本身就在一个单独的类中。

我想要的是,如果调用logError(意味着我有数据库连接问题),我想更新MainForm上的控件以指示错误状态。

我看过代理等,但是所有内容都与Form相关,而我需要的是为一个独立的类函数调用一个表单控件。

实现这一目标的适当方法是什么?

谢谢,

3 个答案:

答案 0 :(得分:2)

两种可能性:

1)允许所有异常从数据访问层冒泡到表示层(表单),捕获表示层中的异常,并在该点记录错误(以及显示错误)。 / p>

2)在数据访问层中可能有错误的类上创建一个事件(比如,ErrorGenerated)。在catch子句中,记录错误,但也会触发ErrorGenerated事件。然后,在表单中,为数据访问类的ErrorGenerated事件分配一个事件处理程序。在事件处理程序中,使用所需的错误指示符更新表单的错误控件。

如果我正在编码,我宁愿选择第一个解决方案,但要么适合你。

答案 1 :(得分:0)

如果logError是一个单独的类中的静态方法,处理此问题的一种非常简单的方法是向单独的错误记录类添加对错误控件的公共静态引用(无论发生什么情况) ,然后在MainForm的Load事件中,将此引用设置为表单上的错误控件。以下是ErrorLogger课程的外观:

public static ErrorControl _errorDisplay = null;
public static logError(string msg)
{
    // log the error
    // display the error
    if (_errorDisplay != null)
    {
        _errorDisplay.DisplayError(msg);
    }
}

...然后在你的MainForm的加载事件中:

ErrorLogger._errorDisplay = errorControl1; // or whatever it's named

这只是一个粗略的示例:_errorDisplay应该是私有的,具有匹配的公共属性,您必须考虑某些类可能在logError之后调用MainForm的情况已关闭。

答案 2 :(得分:0)

我会使用以下可笑的简化方法。

// main form or secondary form code
using (var db = new DbAccess())
{
    if (!db.SaveEmployee(...))
    {
       RecordError(db);
    }
}


void RecordError(DbAccess db)
{
    Logger.logError(db.LastError);

    // update the UI
    statusBar.Status = "Error!";
}



// code in the data access class
public bool SaveEmployee(...)
{
    try { SaveToDb(); return true; }
    catch (Exception ex) { lastError = ex; return false; }
}