2009-03-26 5 views
1

J'ai un formulaire Windows dans .NET qui servira d'assistant pour réaliser quelque chose. Cela contient 3 étapes: Step1, Step2, Step3. Chaque étape est à nouveau réellement un contrôle utilisateur. Le formulaire principal contient un panneau qui affiche l'étape en cours. Lorsque je passe d'une étape à l'autre:

1) Éliminer le contrôle utilisateur en cours en appelant sa méthode Dispose().
2) efface le panneau principal de forme
3) Initialiser le contrôle de l'utilisateur de la prochaine étape et l'ajouter dans le panneau principal

Maintenant, la question est, le contrôle de l'utilisateur de la première étape contient un plus grand contrôle de l'utilisateur. Quand je change à une autre étape et revenir à l'étape 1, je reçois l'erreur suivante:Impossible d'accéder à l'objet éliminé .NET

"Cannot access disposed object." 

Parce que je dois d'abord disposer le contrôle de l'utilisateur avant d'afficher réellement l'autre étape. Et quand je reviens à l'étape 1 et essaie d'ouvrir le contrôle utilisateur à l'étape 1, il donne l'erreur ci-dessus.

Répondre

1

Tout le contenu de la collection Controls d'un contrôle est éliminé lorsque le contrôle est supprimé. Donc, si vous avez besoin de réutiliser ces contrôles utilisateur, vous devrez les supprimer du contrôle utilisateur parent avant de les éliminer.

Il n'est pas nécessaire de disposer du contrôle utilisateur avant d'afficher le suivant. Vous pouvez simplement le retirer du formulaire principal et mettre le nouveau sur le formulaire principal lorsque l'étape change. Conservez vos contrôles utilisateur dans une liste ou dans un dictionnaire et disposez-les tous lorsque le formulaire principal est fermé.

+0

Lorsque j'ai essayé de ne pas disposer du contrôle, je suis confronté à un nouveau problème. L'événement, où j'appelle le contrôle utilisateur placé sur Step1 à afficher, est appelé deux fois. Pouvez-vous s'il vous plaît me dire la raison pour cela? –

+0

Je viens de me rendre compte que pas exactement deux fois .. Il est appelé autant de fois que je passe à une autre étape et je reviens à l'étape 1. –

1

Pourquoi devez-vous mettre au rebut le contrôle utilisateur? Généralement, lorsque le formulaire se ferme, il dispose de tous ses contrôles enfants pour vous. Lorsque vous appelez disposer sur un objet, vous lui dites essentiellement de partir ... vous ne le voulez plus. Vous ne pouvez pas changer d'avis - une fois qu'il est éliminé, il est parti. N'essayez plus de l'utiliser.

En règle générale, vous n'appelez pas disposer sur un objet directement; vous devriez utiliser le modèle "using" pour éviter de disposer d'un objet avant d'en avoir besoin et pour vous assurer que l'objet est éliminé une fois que vous en avez fini avec lui.

Questions connexes