Как отследить падение оконной формы? - PullRequest
3 голосов
/ 03 января 2011

Как отследить падение оконной формы?Как любое событие вызывается или что-либо еще вызывается, или мы можем отследить, что окно формы разбился?Как утилизации называется окно формы разбился.Но что еще произошло, чтобы мы могли отследить падение формы окна?

Например, проблема в том, что у меня есть одно оконное приложение, в котором на главной форме есть всплывающая подсказка, которая перемещается для каждого элемента управления в главной форме иописывает функциональность приложения, указывая элемент управления в главной форме один за другим.И каждый раз, когда шарик перемещается, шарик удаляется и создается новая форма шарика.

Теперь я хочу вставить номер шага в базу данных, когда этот шарик разбился.Я не могу понять, что мне делать?Что происходит, когда разбивается это окно (форма окна)?Есть событие dispose, которое происходит, но происходит каждый раз, когда воздушный шар создает, поэтому есть ли что-то еще, чтобы отследить сбой?

EDIT: Извините всех, я забыл указать, что это с .net Framework 2.0.

Ответы [ 3 ]

4 голосов
/ 03 января 2011

Используйте это: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

Если в потоке форм возникает какое-то необработанное исключение, оно попадает сюда. Если значение равно null, вы получите обычный диалог (возникла необработанная исключительная ситуация, вы можете продолжить или закрыть ее и просмотреть трассировку стека).

3 голосов
/ 03 января 2011

Это отрывок из моей небольшой программы для Windows Forms 2.0:

[STAThread]
private static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    Application.ThreadException +=
        applicationThreadException;

    // Set the unhandled exception mode to force all Windows Forms 
    // errors to go through our handler.
    Application.SetUnhandledExceptionMode(
        UnhandledExceptionMode.CatchException);

    AppDomain.CurrentDomain.UnhandledException +=
        currentDomainUnhandledException;

    ...
}

с двумя обработчиками

private static void currentDomainUnhandledException(
    object sender,
    UnhandledExceptionEventArgs e)
{
    handleException(e.ExceptionObject as Exception);
}

и

private static void applicationThreadException(
    object sender,
    ThreadExceptionEventArgs e)
{
    handleException(e.Exception);
}

Фактическая функция для обработки исключений в моем примере:

private static void handleException(
    Exception exception)
{
    LogCentral.Current.LogError(
        @"Exception occurred.",
        exception);

    if (ErrorForm.IsErrorFormShowing)
    {
        LogCentral.Current.LogInfo(
            @"Error form already showing, not showing again.",
            exception);
    }
    else
    {
        using (var form = new ErrorForm(exception))
        {
            var result = form.ShowDialog();

            if (result == DialogResult.Abort)
            {
                Application.Exit();
            }
        }
    }
}

т.е. он регистрирует ошибку через log4net , а затем отображает форму ошибки, чтобы показать пользователю дополнительную информацию (сообщение об исключении) и разрешить выйти из приложения.

1 голос
/ 03 января 2011

В вашем файле Program.cs поместите блок try / catch внутри функции Main (). Идея состоит в том, чтобы Application.Run ( yourformhere ) находился внутри такого блока. Тогда внутри улова вам, вероятно, удастся сохранить некоторое состояние (например, шаг, на котором шар разбил форму) в БД. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...