Impossible d'accéder à un objet supprimé?
J'ai un compte à rebours de forme - sur le premier formulaire que l'utilisateur va entrer dans le temps de compte à rebours - les délais d'alerte, le message de fin, etc. Il y a également deux boutons Radio (Max/Min) et selon celle qui est sélectionnée qu'ils vont ouvrir une nouvelle Max ou Min forme où le temps va commencer le compte à rebours. Il fonctionne très bien et le compte à rebours que j'attends. Cependant si j'ai sortie la valeur Max ou Min la forme et essayer de courir à nouveau avec une nouvelle fois, j'obtiens l'erreur. Le code est ci-dessous - la en commentaire .ShowDialog (); était quelque chose que j'ai essayé - il permettez-moi de fermer et d'ouvrir les nouvelles formes ok, mais il n'a pas fait de commencer le compte à rebours. UpdateLabels est la fonction qui fait la mise à jour des Étiquettes.
bool Max = rbMax.Checked;
if (Max == true)
{
//_Max.ShowDialog(this);
_Max.Show();
}
else
//_Min.ShowDialog(this);
_Min.Show();
UpdateLabels();
}
J'ai aussi essayé la suite de laquelle j'ai lu en ligne comme une solution possible mais elle n'a pas de travail....
private void Max_FormClosing(object sender, FormClosingEventArgs e)
{
this.Hide();
this.Parent = null;
}
Quelqu'un peut m'aider - je peux poster le UpdateLabels fonction si nécessaire. Je suis assez nouveau à l'INTERFACE utilisateur de développement C# de sorte que toute aide serait super. Merci.
Form.ShowDialog
et Form.Show
est que le premier n'a pas automatiquement Dispose
votre forme, tandis que les seconds ne. La raison pour cela est que si vous montrez une forme mode moins (c'est à dire avec Form.Show
), l'exécution du programme retourne à ton code avant le formulaire est fermé, et vous n'avez pas de moyen facile de savoir quand le formulaire est fermé, à l'extérieur de votre Form
classe. Donc, parce que vous n'avez pas le bon endroit pour appeler Dispose
, Windows Forms, prend la responsabilité de le faire pour vous au bon moment (lorsque le formulaire est fermé).
OriginalL'auteur Ctrl_Alt_Defeat | 2011-08-09
Vous devez vous connecter pour publier un commentaire.
Le problème est, qu'une forme fermée ne peut pas être utilisé plus (réouverture). C'est pourquoi le code que vous avez posté essaie d'arrêter de clôture et ne cache de votre fenêtre. Mais pour ce faire, l'annulation de la propriété doit être définie sur true:
Pour afficher le formulaire après la fermeture de cette façon, montrez-la avec la méthode Show ().
Toutefois, ce n'est probablement qu'une solution de contournement et vous pourriez résoudre le problème avec un autre design.
Peut-être qu'il serait sage, pour créer une nouvelle instance de votre formulaire, chaque fois que vous en avez besoin, au lieu d'essayer de l'ouvrir à nouveau à chaque fois. Cela a aussi l'avantage que le formulaire ne requesires ressources si elle est vraiment nécessaire.
Qui a travaillé - grand. Merci beaucoup HCL. Juste pour une certaine compréhension pouvez-vous expliquer brièvement ce qui a été fait? Cheers
J'ai étendu ma réponse. Ok?
Merci pour l'explication complémentaire et oui, il peut être mieux de faire un peu plus de design, mais cette solution va être cool pour l'instant.
OriginalL'auteur HCL
Ce que vous pouvez faire est d'ajouter un cocher suivantes avant d'appeler .Méthode Show:
et de même pour _Min forme
Ce ne sera pas fiable. Si plusieurs threads accèdent à la forme (ou peut-être des événements) il n'y a aucune garantie que la forme est toujours la valeur null après l'instruction if. Au minimum, vous devez placer un verrou autour de chaque accès de la forme, si vous voulez que cela fonctionne.
OriginalL'auteur Waqas
Chaque fois qu'un formulaire est fermé, toutes ses ressources sont libérées. Cela signifie que vous ne pouvez pas accéder à l'objet, car il n'existe plus - il a été libéré et supprimés de la mémoire. Pour éviter cela, vous pouvez annuler la fermeture du formulaire, et de le cacher à la place (qui apparaît transparent pour l'utilisateur).
Une version mise à jour de votre code comme suit:
OriginalL'auteur foxy
La solution est simple pour instancier l'objet de la forme dans l'événement click du bouton par exemple
OriginalL'auteur Manoj Pathak
Créer un Objet à l'intérieur de l'événement clic du bouton
comme ce
OriginalL'auteur Amit Vekaria