обновить элемент управления в MainForm из отдельного метода класса

#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 закрытия.