ObjectDisposedException при открытии нескольких форм - PullRequest
1 голос
/ 15 июля 2010

В моем приложении C # Winform возникает ситуация, когда оно не может получить доступ к удаленному объекту. Уничтоженный объект - это форма (frmQuiz), которая открывается кнопкой на форме входа в систему.

Ситуация:

Мое приложение обычно имеет две или три формы, открытые одновременно. Файл Program.cs запускается в форме frmLoginBackground, которая представляет собой полупрозрачный фон, закрывающий экран компьютера. Событие загрузки для этой формы открывает вторую форму, frmLogin, которая включает в себя кнопку, открывающую frmQuiz, которая является простой формой с несколькими математическими вопросами.

Код в frmLogin, который открывает frmQuiz, выглядит следующим образом:

private void btnTakeQuizNow_Click(object sender, EventArgs e)
{
    frmQuiz quiz = new frmQuiz();
    quiz.TakeQuizNow("take_quiz_now", Convert.ToInt32(comboQuizMeNow.SelectedValue));  //Pass the form a quiz id number.
    quiz.Show();
}

Когда открывается frmQuiz, он и frmLogin открыты и доступны.

frmLogin также содержит элемент управления паролем, который открывает форму администрирования, сначала открывая frmSplash, который представляет собой всплывающую форму «Please Wait ...», основанную на таймере. Событие Tick timer запускает frmAdmin, который является формой администрирования. Код в frmLogin выглядит так:

private void btnPasswordSubmit_Click(object sender, EventArgs e)
{
     //Password verification code snipped.

     frmSplash objSplash = new frmSplash();
     objSplash.Show();
   //this.Hide();
     this.Close();
}

А код в frmSplash выглядит так:

private void timer1_Tick(object sender, EventArgs e)
{
    frmAdmin objfrmAdmin = new frmAdmin ();
    objfrmAdmin.Show();
    this.Close();
}

Когда открывается frmAdmin, frmLogin больше не доступен; однако, frmAdmin содержит кнопку «Вернуться к экрану входа» с кодом, подобным следующему:

private void btnReturnToLogin_Click(object sender, EventArgs e)
{
    exitWarnings("return_to_login");
}

private void exitWarnings(string action)
{
    //Warning message code snipped.

    if (action == "return_to_login")
    {
        frmLogin objLogin = new frmLogin();
        objLogin.Show();
    }
}

frmLoginBackground остается открытым до выхода из приложения.


Проблема:

Все работает нормально, когда сначала открывается frmLogin и нажимается кнопка, чтобы открыть frmQuiz. Форма викторины открывается хорошо работает. Однако после входа в форму администрирования (которая закрывает или скрывает форму входа), а затем щелкнув ссылку «Вернуться к экрану входа», затем, после повторного появления frmLogin, возникает исключение удаления объекта при нажатии кнопки для открытия frmQuiz. Visual Studio выделяет желтым цветом "quiz.Show ();" строка кода. Исключение происходит независимо от погоды, я использую "this.Close ();" или "this.Hide ();" в событии btnPasswordSubmit_Click.

Может кто-нибудь предложить решение, позволяющее мне открывать frmQuiz после возвращения в frmLogin из frmAdmin.

Ура, Фредерик

1 Ответ

0 голосов
/ 16 июля 2010

Так как вы создаете новый экземпляр для quizz непосредственно перед quizz.Show(), он не может сам подвергнуться опросу, который вызывает исключение.

Внимательно посмотрите на конструктор и событие FormCreate frmQuiz. Похоже, именно здесь пинают мертвую лошадь.

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