2009-09-05 43 views
1

我有一個簡單的應用程序,有時打開第二個窗體的MainForm。我有一個數據訪問層類.cs,並已嘗試catch語句。在catch上,我調用另一個類方法logError。從單獨的類方法更新MainForm控件

由於logError可以被任何線程或2個窗體調用,它本身就在一個獨立的類中。

我想要的是,如果調用logError(意味着我有一個數據庫連接問題),我想更新MainForm上的控件來指示錯誤狀態。

我已經看過代表等,但一切都是窗體相關的,而我需要的是調用一個獨立的類函數的窗體控件。

什麼是實現這一目標的適當方法?

感謝,

回答

2

兩種可能性:

1)允許所有異常冒泡從數據訪問層,表示層(表單),趕在表示層異常,並記錄錯誤在這一點(以及顯示錯誤)。

2)在數據訪問層的類中創建一個可能有錯誤的事件(比如ErrorGenerated)。在你的catch子句中,記錄錯誤,但也觸發ErrorGenerated事件。然後,在您的表單中,將事件處理程序分配給數據訪問類的ErrorGenerated事件。在事件處理程序中,使用所需的錯誤指示符更新表單的錯誤控制。

如果我在編碼,我寧願選擇第一個解決方案,但是要麼適合你。

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 Load事件:

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

這只是一個粗樣品:_errorDisplay應該是私人的,匹配公共財產,並且你必須考慮在MainForm已關閉後某些班級可能會撥打logError的情況。

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