Das schließen einer form bei einem Konstruktor
Ist es möglich, ein Formular zu schließen, während der Konstruktor ausgeführt wird (oder einfach nur zu stoppen, zeigen in diesem Stadium)?
Ich habe den folgenden code:
public partial class MyForm : Form
{
public MyForm()
{
if (MyFunc())
{
this.Close();
}
}
}
Die wirft eine ObjectDisposedException in Main(), hier:
static void Main()
{
...
//Following line errors
Application.Run(new MyForm());
}
Habe ich versucht, das Ergebnis überprüfen von MyForm wie diese:
static void Main()
{
...
MyForm frm = new MyForm();
if (frm != null)
{
//Following line errors
Application.Run(frm);
}
}
Aber das scheint nicht zu helfen. Kann mir jemand sagen, einen Weg, um dieses, bitte? Vielleicht ein Weg, um überprüfen Sie die form, um zu sehen, ob es noch existiert?
- Welche Ausnahme machen Sie?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aufrufen
Close
aus dem Konstruktor des Formulars ist nicht möglich, da es rufenDispose
auf ein Formular, das noch nicht angelegt wurde. Um das Formular zu schließen nach dem Bau weisen eine anonyme event-handler, um dieLast
- Ereignis schließt Ihr Formular, bevor Sie es zum ersten mal dargestellt:Die einzige Sache, die Sie tun können, es setzt ein flag, um es zu schließen im Konstruktor, und dann schließen Sie es in der
Shown
Veranstaltung. Natürlich, wenn du tust, dass es Sinn macht, verschieben Sie den code, um festzustellen, ob es geschlossen werden sollte es in den ersten Platz.Folgendes gut funktioniert:
Wenn Sie rufen Sie Close() auf einem Formular, intern ist es mit der Entsorgung der form und der Freigabe von verwalteten Ressourcen. Wenn Sie dies tun:
Werden Sie wahrscheinlich eine ObjectDisposedException. Was Sie tun müssen, ist, legen Sie das Formular Sichtbarkeit durch eine Eigenschaft:
Nur stellen Sie sicher, entfernen Sie den Aufruf von Close() in den Konstruktor, oder sogar verschieben der Eigenschaft-Zuordnung gibt es auch.
Können Sie MyFunc statische? und dann tun Sie etwas wie:
dies würde im wesentlichen geben Ihnen die gleiche Kontrolle, ob das Formular wird gebaut-oder nicht?
Fand ich das hinzufügen eines handlers zu den 'Load' - event ist besser als diese Weise wird der dialog nie angezeigt. Mit der 'Gezeigt' Veranstaltung, die Sie vielleicht kurz sehen das Dialogfeld öffnen und dann schließen, das kann verwirrend sein:
Environment.Exit(...)
ist, für mich zu arbeiten (ohne Fenster flackern):Ich denke, es ist nicht klug, um ein Formular zu schließen, die im Konstruktor. Wenn Sie dies tun, werden Benutzer des Formulars nicht weiß, ob ShowDialog oder nicht.
Dem folgenden code wäre ganz normal verwenden:
Wenn Sie sich entschieden, im Konstruktor, ob die Form sollte gezeigt werden, müssten Sie code hinzufügen, nach Bau zu entscheiden, ob der Aufruf von ShowDialog oder nicht und ob der dialog Ergebnis.
Darüber hinaus sind Sie sicher, dass die änderung der Eigenschaften wird nie Einfluss, ob das Formular angezeigt werden soll oder nicht? Auch nach zukünftigen änderungen?
Während der Bau-form wird nicht angezeigt /geöffnet noch. Also ich fürchte
Close()
tun nicht, was Sie erwarten.In der neat-Methode zu tun, die überprüft, dass Sie das tun wollten, die im Konstruktor in der Form_Load. Fügen Sie einen Ereignishandler für das form-load und tun Sie Ihre Schecks in der event-handler. Verwenden Sie die Eigenschaft DialogResult zu zeigen, dass Sie beschlossen, nicht zu zeigen, die form.
Den Benutzer, der den code überprüfen könnte, das Ergebnis des dialogs:
Jedoch, Aufruf von Close() in der Ereignisprozedur für das Formular-load funktioniert nicht, weil
Close()
kann nur aufgerufen werden, richtig, nachdem der Ladevorgang abgeschlossen ist.Daher, anstelle von aufrufen
Close()
sollten SieBeginInvoke
die Close () - Funktion, so dass dieClose
Funktion wird aufgerufen, nachdem das laden fertig ist:Wenn Sie möchten, dass Ihre Fenster nie gesehen
(kein flackern windows, öffnen sich für einen Augenblick und verschwinden dann):
Obwohl
Show(...)
2 überladungen undShowDialog(...)
2 zu.Funktioniert nicht für das Hauptformular geöffnet wird, über
Application.Run()
. Aber wer würde das tun sowieso? Außer es gibt auch einen Weg zu öffnen, die Haupt-form ohne VerwendungApplication.Run()
.