2010-07-15 5 views
1

Mon application C# Winform rencontre la situation dans laquelle elle ne peut pas accéder à un objet éliminé. L'objet disposé est un formulaire (frmQuiz) qui est ouvert à partir d'un bouton sur le formulaire de connexion.ObjectDisposedException lorsque plusieurs formulaires sont ouverts

Situation:

Mon application a généralement deux ou trois formes ouvertes en même temps. Le fichier Program.cs s'exécute sous la forme frmLoginBackground, qui est juste un arrière-plan semi-transparent qui couvre l'écran de l'ordinateur. L'événement de chargement de ce formulaire ouvre le deuxième formulaire, frmLogin, qui comprend un bouton qui ouvre frmQuiz, qui est un formulaire simple avec quelques questions de maths dessus.

Le code frmLogin qui ouvre frmQuiz ressemble à ceci:

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

Lorsque frmQuiz ouvre à la fois et frmLogin sont ouverts et accessibles. Le frmLogin contient également un contrôle de mot de passe qui ouvre le formulaire d'administration en ouvrant d'abord frmSplash, qui est un formulaire de démarrage "Please Wait ..." basé sur un minuteur. L'événement Tick timer lance frmAdmin, qui est le formulaire d'administration. Le code frmLogin ressemble à ceci:

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

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

Et le code frmSplash ressemble à ceci:

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

Lorsque frmAdmin ouvre alors frmLogin n'est plus accessible; Cependant, frmAdmin contient un « Retour à Écran de connexion » bouton avec le code comme ceci:

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

Le frmLoginBackground reste ouvert jusqu'à la sortie de l'application.


Le problème:

Tout fonctionne bien quand frmLogin ouvre d'abord et clique sur le bouton pour ouvrir frmQuiz. Le formulaire de quiz ouvre une course bien. Cependant, après vous être connecté au formulaire d'administration (qui ferme ou cache le formulaire de connexion) puis en cliquant sur le lien "Revenir à l'écran de connexion", une fois que frmLogin réapparaît, l'exception disposée se produit lorsque vous cliquez sur le bouton pour ouvrir frmQuiz. Visual Studio met en surbrillance en jaune le "quiz.Show();" ligne de code. L'exception se produit indépendamment du temps que j'utilise "this.Close();" ou "this.Hide()" dans l'événement btnPasswordSubmit_Click. Est-ce que n'importe qui peut suggérer une solution qui me permet d'ouvrir frmQuiz après le retour à frmLogin de frmAdmin.

Cheers, Frederick

Répondre

0

Depuis la création d'une nouvelle instance pour quizz juste avant la quizz.Show() il ne peut pas être lui-même quizz qui lève l'exception.

Regardez bien le constructeur et l'événement FormCreate de frmQuiz. On dirait que c'est là que le cheval mort est kické.

+0

Merci Henk. Cela m'a indiqué dans la bonne direction. Le problème est dû au fait que frmAdmin reste ouvert après avoir cliqué sur le bouton 'Return to Login Screen' et que frmQuiz a du code pour ne pas afficher le quiz si frmAdmin est ouvert - bien que je ne comprenne pas pourquoi cela provoque une erreur d'objet. Mais il est maintenant fixé. – Frederick

Questions connexes