#c# #.net #winforms
#c# #.net #winforms
Вопрос:
У меня есть простое приложение с MainForm, которое иногда открывает вторую форму. У меня есть класс уровня доступа к данным Class .cs, в котором есть инструкции try catch . При перехватывании я вызываю метод другого класса LogError.
Поскольку LogError может быть вызван любым потоком или из двух форм, он находится в отдельном классе сам по себе.
Чего бы я хотел, так это того, что если вызывается LogError (это означает, что у меня проблема с подключением к БД) Я хотел бы обновить элемент управления в MainForm, чтобы указать статус ошибки.
Я просмотрел делегаты и т.д., Но все связано с формой, в то время как мне нужно вызвать элемент управления формой для независимой функции класса.
Какой был бы подходящий способ достичь этого?
Спасибо,
Ответ №1:
Две возможности:
1) Разрешить всем исключениям всплывать с уровня доступа к данным на уровень представления (ваши формы), перехватывать исключение на уровне представления и регистрировать ошибку в этот момент (а также отображать ошибку).
2) Создайте событие (скажем, ErrorGenerated) для класса на уровне доступа к данным, которое может содержать ошибку. В вашем предложении catch запишите ошибку в том виде, в каком она у вас есть, но также запустите событие, вызванное ошибкой. Затем в вашей форме назначьте обработчик события для сгенерированного с ошибкой события класса доступа к данным. В обработчике событий обновите элемент управления вашей формой с нужным индикатором ошибки.
Если бы я занимался кодированием, я бы предпочел первое решение, но для вас должно сработать либо то, либо другое.
Ответ №2:
Я бы использовал следующий комично упрощенный подход.
// 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; }
}
Ответ №3:
Если 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
закрытия.