Benutzer mit den meisten Antworten
zur Runtime erstellte Form vor dem öffnen schliessen.

Frage
-
Ich erstelle in meinem Programm zur laufzeit ein Fenster via Button wenn ich den Button nun erneut betätige öffnet es noch ein Fenster egal ob es schon offen ist oder nicht. In von VS2010 vorgegebene Forms passiert das nicht ich finde aber nicht herraus warum das so ist entweder übersehe ich das im code oder verstehe den hintergrund nicht.
Public Sub ReportForm() Try Dim LZform As New Form LZform.Icon = My.Resources.favicon Dim CRV As New CrystalDecisions.Windows.Forms.CrystalReportViewer With LZform .MinimumSize = New Size(600, 400) .Size = New Size(600, 400) .Show() End With LZform.Controls.Add(CRV) With CRV .Dock = DockStyle.Fill .Zoom(100) ' .DisplayGroupTree = False .ShowRefreshButton = False .ShowCloseButton = False .ShowGroupTreeButton = True .ShowParameterPanelButton = False .Visible = True End With ' 'meine code usw. hier ' End Try End Sub
Wie kann ich in diesem fall das vorher Prüfen ob das Fenster offen oder nicht ist.
Antworten
-
Hallo,
da Du jedesmal eine neue Formularinstanz erstellst, wird konsequenterweise ein neues Formular erzeugt.
Um das zu verhindern:
Speichere die LZForm Variable auf Klassenebene.
Ein Formular solltest nur erstellen, wenn es noch nicht erzeugt wurde (Nothing).
Ist das Formular bereits vorhanden, kannst Du es mit Activate in den Vordergrund holen.
Um mitzubekommen, ob das Formular zwischenzeitlich vom Anwender geschlossen wurde,
abbonniere das FormClosed-Ereignis. und setze LZForm auf Nothing.Show sollte zudem erst ausgeführt werden, wenn Du alle Steuerelemente platziert hast,
sonst "zappelt" der Bildschirmaufbau schon mal.Das Ganze angedeutet:
Private LZForm As Form Public Sub ReportForm() If LZForm Is Nothing Then ' Neues Formular erzeugen LZForm = New Form() AddHandler LZForm.FormClosed, AddressOf LZForm_FormClosed ' ... weitere Initialisierung ' Erst ganz zum Schluss Show() LZForm.Show() Else ' Vorhandenes Formular aktivieren LZForm.Activate() End If End Sub Private Sub LZForm_FormClosed(sender As Object, e As FormClosedEventArgs) ' Beim nächsten Aufruf neues Formular erstellen RemoveHandler Me.LZForm.FormClosed, AddressOf LZForm_FormClosed Me.LZForm = Nothing End Sub
Gruß Elmar
- Als Antwort vorgeschlagen Thorsten DörflerModerator Montag, 15. August 2011 12:37
- Als Antwort markiert aktony Dienstag, 16. August 2011 06:29
Alle Antworten
-
Hallo,
da Du jedesmal eine neue Formularinstanz erstellst, wird konsequenterweise ein neues Formular erzeugt.
Um das zu verhindern:
Speichere die LZForm Variable auf Klassenebene.
Ein Formular solltest nur erstellen, wenn es noch nicht erzeugt wurde (Nothing).
Ist das Formular bereits vorhanden, kannst Du es mit Activate in den Vordergrund holen.
Um mitzubekommen, ob das Formular zwischenzeitlich vom Anwender geschlossen wurde,
abbonniere das FormClosed-Ereignis. und setze LZForm auf Nothing.Show sollte zudem erst ausgeführt werden, wenn Du alle Steuerelemente platziert hast,
sonst "zappelt" der Bildschirmaufbau schon mal.Das Ganze angedeutet:
Private LZForm As Form Public Sub ReportForm() If LZForm Is Nothing Then ' Neues Formular erzeugen LZForm = New Form() AddHandler LZForm.FormClosed, AddressOf LZForm_FormClosed ' ... weitere Initialisierung ' Erst ganz zum Schluss Show() LZForm.Show() Else ' Vorhandenes Formular aktivieren LZForm.Activate() End If End Sub Private Sub LZForm_FormClosed(sender As Object, e As FormClosedEventArgs) ' Beim nächsten Aufruf neues Formular erstellen RemoveHandler Me.LZForm.FormClosed, AddressOf LZForm_FormClosed Me.LZForm = Nothing End Sub
Gruß Elmar
- Als Antwort vorgeschlagen Thorsten DörflerModerator Montag, 15. August 2011 12:37
- Als Antwort markiert aktony Dienstag, 16. August 2011 06:29