La fermeture d'un formulaire lors d'un constructeur
Est-il possible de fermer un formulaire alors que le constructeur est en cours d'exécution (ou tout simplement pour l'arrêter montrant à ce stade)?
J'ai le code suivant:
public partial class MyForm : Form
{
public MyForm()
{
if (MyFunc())
{
this.Close();
}
}
}
Qui jette un ObjectDisposedException dans main(), ici:
static void Main()
{
...
//Following line errors
Application.Run(new MyForm());
}
J'ai essayé de vérifier le résultat de MyForm comme ceci:
static void Main()
{
...
MyForm frm = new MyForm();
if (frm != null)
{
//Following line errors
Application.Run(frm);
}
}
Mais cela ne semble pas aider. Quelqu'un peut me dire un moyen de contourner cela, s'il vous plaît? Peut-être un moyen de vérifier le formulaire pour voir s'il existe encore?
- Quel exception obtenez-vous?
Vous devez vous connecter pour publier un commentaire.
Appel
Close
à partir du constructeur de la Forme n'est pas possible, qu'il appelleraDispose
sur une Forme qui n'a pas encore été créé. Pour fermer le Formulaire après les travaux de construction, d'attribuer un anonyme, un gestionnaire d'événement à l'Vide
événement qui ferme votre Formulaire est affiché pour la première fois:La seule chose que vous pourriez faire de définir un indicateur de proximité dans le constructeur, puis la fermeture dans le
Shown
événement. Bien sûr, si vous faites cela, il est judicieux de déplacer le code pour déterminer si elle doit être fermé il y a en premier lieu.Le suivant fonctionne bien:
Lorsque vous appelez Close() sur un formulaire, à l'interne, c'est l'élimination de la forme et de libérer toutes les ressources gérées. Lorsque vous faites cela:
Vous aurez probablement une ObjectDisposedException. Ce que vous devez faire est de définir la Forme de la visibilité grâce à une propriété:
Assurez-vous de supprimer l'appel à Close() dans le constructeur, ou même le déplacement de l'affectation de propriété il y a aussi.
Pouvez-vous faire Mafonction statique? et puis faire quelque chose comme:
cela aurait pour effet de vous donner le même contrôle sur la forme que va être construit ou pas?
J'ai trouvé l'ajout d'un gestionnaire à la "Charge" de l'événement est mieux que de cette façon, le dialogue n'est jamais affiché. Avec le 'Montré' événement que vous pouvez brièvement voir la boîte de dialogue ouvrir, puis fermer ce qui peut être source de confusion:
Environment.Exit(...)
est de travailler pour moi (sans scintillement des fenêtres):Je pense qu'il n'est pas sage de fermer un formulaire dans le constructeur. Si vous faites cela, les utilisateurs de votre formulaire ne sais pas si ShowDialog ou pas.
Le code suivant devrait être tout à fait normal utilisation:
Si vous avez décidé dans le constructeur si le Formulaire doit être affiché, vous devrez ajouter de code après la construction de décider de l'appel ShowDialog ou pas et si les Processus de la boîte de dialogue résultat.
Par ailleurs, êtes-vous sûr que le fait de changer les propriétés ne jamais l'influence que le formulaire doit être montré ou pas? Aussi, après les changements futurs?
Pendant la construction, la forme n'est pas indiqué /encore ouvert. Donc je crains
Close()
ne fait pas ce que vous attendez.Neat méthode est de faire les vérifications que vous vouliez faire dans le constructeur dans le Form_Load. Ajouter un gestionnaire d'événements pour le chargement du formulaire et de faire de votre vérifie dans le gestionnaire d'événements. Utiliser la propriété DialogResult pour indiquer que vous avez décidé de ne pas afficher le formulaire.
L'utilisateur du code peut vérifier le résultat de la boîte de dialogue:
Toutefois, l'appel à Close() dans le gestionnaire d'événements pour le chargement du formulaire ne fonctionne pas, parce que
Close()
ne peut être appelée correctement après la Charge est terminée.Par conséquent, au lieu d'appeler
Close()
, vous devriezBeginInvoke
la fonction Close (), de sorte que leClose
fonction sera appelée après que le chargement est terminé:Si vous voulez que votre fenêtre de jamais vu
(pas de scintillement des fenêtres qui s'ouvrent pendant un instant, puis disparaît):
Si
Show(...)
a 2 surcharges etShowDialog(...)
a 2 de trop.Ne fonctionne pas pour le formulaire principal qui est ouvert via
Application.Run()
. Mais qui aurait pu le faire de toute façon? Sauf qu'il est aussi un moyen d'ouvrir le formulaire principal sans l'aide deApplication.Run()
.