Form Load / Shown?

  • VB.NET
  • .NET 4.5

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Amelie.

    Form Load / Shown?

    Hallo

    Ich habe ein Problem und komme nicht weiter bzw finde nicht heraus warum das nicht klappt.
    Folgendes:

    frm_Main: Laden der Form in einen Container; klappt alles.

    VB.NET-Quellcode

    1. Public Class frm_Main
    2. Dim AppSet As New AppSettings
    3. Dim AppFnc As New AppFunktionen
    4. Private Sub btn_sdcopy_Click(sender As Object, e As EventArgs) Handles btn_sdcopy.Click
    5. AppFnc.switchPanel(frm_sdcopy, False)
    6. Me.btn_sdcopy.Enabled = False
    7. End Sub
    8. Private Sub btn_settings_Click(sender As Object, e As EventArgs) Handles btn_settings.Click
    9. AppFnc.switchPanel(frm_settings, False)
    10. Me.btn_settings.Enabled = False
    11. End Sub
    12. .
    13. .
    14. End Class


    Die Klassendatei:

    VB.NET-Quellcode

    1. 'Funktion Forms aufrufen
    2. Public Sub switchPanel(ByRef formName As Form, ByVal formAktiv As String)
    3. Call Forms_close()
    4. frm_Main.pn_Container.Controls.Clear()
    5. formName.TopLevel = False
    6. frm_Main.pn_Container.Controls.Add(formName)
    7. formName.Show()
    8. End Sub
    9. '------
    10. 'Funktion Form schließen
    11. Public Sub Forms_close()
    12. If frm_sdcopy IsNot Nothing Then frm_sdcopy.Hide() : frm_Main.btn_sdcopy.Enabled = True
    13. If frm_settings IsNot Nothing Then frm_settings.Hide() : frm_Main.btn_settings.Enabled = True
    14. .
    15. ...
    16. End Sub


    Die aufgerufene Form:

    VB.NET-Quellcode

    1. Public Class frm_sdcopy
    2. Dim AppSet As New AppSettings
    3. Dim AppFnc As New AppFunktionen
    4. .
    5. Private Sub frm_sdcopy_Show(sender As Object, e As EventArgs) Handles Me.Shown
    6. AppSet.getToolsettings()
    7. ...
    8. ....
    9. MessageBox.Show("Bin hier angekommen")
    10. [b]' Bei der msgBox kommt der Code NUR beim ersten Aufruf an. Rufe ich derweil eine andere Form in den Container und
    11. ' lade dann erneut diese hier auf passiert nichts. Habe das ganze schon mit "Load" und "Shown" durchgetestet.[/b]
    12. .
    13. If AppSet.mstrzipaktiv = 1 Then
    14. lbl_zipsave.Text = "mache dies"
    15. Else
    16. lbl_zipsave.Text = "mache das"
    17. End If
    18. End Sub


    Hoffe Ihr könnt mir helfen. DANKE :)
    @Amelie Kannst Du das mal in ein kleines Projekt packen und als ZIP anhängen (ohne obj, bin, vs-Ordner), damit wir das direkt testen können?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Ja sischer dat. Du erstellst ja laut dem Code die frm_sdcopy-Instanz noch nicht mal selbst, sondern arbeitest mit frm_sdcopy.Show. Siehe hier:
    Dialoge richtig instanziieren
    Warum »Form1.Show« und Co. einem irgendwann ins Bein schießen
    Dadurch hast Du eine vom Compiler automatisch generierte Form-Instanz am Wickel, die Du später sogar auch nur versteckst und wieder zeigst (Hide, Show). Da aber frm_sdcopy_Show nur bei der ersten Anzeige aufgerufen wird (siehe Mikrosaft-Doku), ist kein anderes Verhalten zu erwarten. Lies Dich daher bitte nochmal in die korrekte Verwendung von Form-Instanzen (s.o.) und die entsprechende Eventdoku ein. Und arbeite dann korrekt mit Instanzen und schließe diese richtig, anstatt sie zu verstecken. Dann wird auch das Shown-Event wie erwartet aufgerufen. Vom Weg über das Alternativevent Activated rate ich Dir dringend ab, das wird immer dann gefeuert, wenn das Form den Eingabefokus erhält. Und das wäre viel zu oft. Vielleicht eher noch das VisibleChanged-Event.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    Jou, selber Fehler. Keine Explizit-Instanz-Verwendung. Daher schweben die Forms in der Luft, nachdem sie geschlossen und wieder geöffnet werden. Nur die allererste (leider automatisch generierte) Forminstanz wird dem Panel hinzugefügt. Sobald sie geschlossen wurde, ist sie weg. Die Verwendung von Form1.Show generiert eine neue Instanz. Aber der Compiler sieht natürlich keinen Grund, diese Forminstanz ins Panel zu packen. Ist ja für ihn ne andere als beim ersten Mal.

    btw: Das Projekt hat ziemlich wenig mit dem Code von Post#1 zu tun.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    @Amelie Arbeite durch und verstehe diesen Thread:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Ok, und was willst Du uns nun mit der Kurzfassung sagen? Das ist jetzt durch die Kürzung komplett verloren gegangen. Welches Problem willst Du in Deiner Kurzfassung behoben haben? Denn wenn ich jetzt in den Form1_Shown-EventHandler MessageBox.Show("1") reinschreibe und in den Form2_Shown-EventHandler MessageBox.Show("2"), dann werden diese MessageBoxen jedes Mal angezeigt, wenn ich die Forms schließe und sie mit den Buttons wieder öffne. So what?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    @Amelie In jedem Falle musst Du Dich mit dem Aufruf von Dialogen unter .NET befassen:
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Is ja jut jetze. Das ist jetzt schon der 3. Aufruf diesbezüglich (Post#3, #6, #9). @Amelie war auch schon in dem Thread drinne, hatte ich hier gesehen. Ob das alles gelesen, verstanden und angewendet wird, steht zwar auf nem anderen Blatt. Aber wir wollen doch mal optimistisch bleiben, gelle ;) ?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    Sie stellt keine Fragen dazu bzw. bietet keinen neuen Code an. ;(
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    @RodFromGermany

    So dieser code macht genau das was ich mir vorstellte.

    VB.NET-Quellcode

    1. Public Class frm_Main
    2. Private Sub Forms_close()
    3. Me.pn_container.Controls.Clear()
    4. btn_settings.Enabled = True
    5. btn_copy.Enabled = True
    6. End Sub
    7. Private Sub btn_settings_Click(sender As Object, e As EventArgs) Handles btn_settings.Click
    8. Forms_close()
    9. Dim Form1 As New frm_settings
    10. Form1.TopLevel = False
    11. Me.pn_container.Controls.Add(Form1)
    12. Form1.Show()
    13. btn_settings.Enabled = False
    14. End Sub
    15. Private Sub btn_copy_Click(sender As Object, e As EventArgs) Handles btn_copy.Click
    16. Forms_close()
    17. Dim Form2 As New frm_copy
    18. Form2.TopLevel = False
    19. Me.pn_container.Controls.Add(Form2)
    20. Form2.Show()
    21. btn_copy.Enabled = False
    22. End Sub
    23. End Class

    Zum Testen sind Form1 und Form2 identisch

    VB.NET-Quellcode

    1. Public Class frm_copy
    2. Private Sub frm_copy_Load(sender As Object, e As EventArgs) Handles Me.Load
    3. MessageBox.Show("Bin hier frmCopy angekommen")
    4. End Sub
    5. End Class

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Amelie“ ()

    Neu

    @RodFromGermany und alle anderen ;)

    Habe mal eine Frage zur Fehlerbehandlung.
    Kann man das so nicht an eine andere Form übergeben?
    DANKE ;)


    VB.NET-Quellcode

    1. Catch ex As Exception
    2. MessageBox.Show("Fehler: " & ex.ToString) [b]'<=====Hier steht der Fehlercode drin!!
    3. [/b]
    4. ex.HelpLink = ex.ToString [b]' <=====In der Form frm_error wird nichts angezeigt!!
    5. [/b]
    6. Dim prüfen As String = "fehler"
    7. Dim form = New frm_error(prüfen)
    8. form.ShowDialog()
    9. End Try


    Das hier klappt. Alle Fehler werden angezeigt.

    VB.NET-Quellcode

    1. ElseIf tb_ziphdd.Text = tb_workhdd.Text Then
    2. Dim prüfen As String = "verzeichnis_gleich"
    3. Dim form = New frm_error(prüfen)
    4. form.ShowDialog()


    Die Form frm_error

    VB.NET-Quellcode

    1. Public Sub New(ByVal prüfen As String)
    2. InitializeComponent()
    3. Select Case prüfen
    4. Case Is = "fehler"
    5. errormessage = ex.HelpLink '[b]<==Hier kommt nichts an???[/b]
    6. Case Is = "fertig"
    7. errormessage = "Auftrag abgeschlossen." & vbCrLf & "usw....."
    8. Case Is = "verzeichnis_leer" '......... .......
    9. '....
    10. '......

    Neu

    @Amelie

    Wäre es nicht sinnvoll die Formen frm_settings und frm_copy als UserControls zu definieren. Dann macht meiner Meinung dein Code für mich mehr Sinn. Du bindest eine Form an ein Panel (Controls.Add) und machst dann ein Show. Das verstehe ich nicht, was hat das für einen Sinn?

    Bezüglich der Fehlermeldung, würde ich einen Event auslösen, welcher dann von der entsprechenden Form angefangen und ausgewertet wird. Ich mache meine Kommunikationen zwischen den Formen/Hauptform meistens mit Events...

    Neu

    Amelie schrieb:

    VB.NET-Quellcode

    1. ex.HelpLink = ex.ToString ' <=====In der Form frm_error wird nichts angezeigt!!
    Was genau stellst Du Dir unter ex.HelpLink vor?
    Was hat das mit Deiner frm_error zu tun?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    @Amelie

    so habe ich das mit den UserControls gemeint...

    ...und das UserControl kann natürlich auch Events auslösen, welche das Hautpformular abfängt und auswertet...
    Dateien

    Neu

    Du musst schon die Exception-Meldung an das SubForm weitergeben, sonst passiert da gar nix. Woher soll das SubForm wissen, was ex ist?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    Ich habe jetzt noch ein schnelles Event Handling eingebaut. Vielleicht hilft es ...

    Der Code ist wahrscheinlich nicht ganz perfekt, aber zum Verständnis oder als Idee sollte es reichen.

    Anstatt meiner Message könntest du auch die Exeption Message weiterleiten...
    Dateien

    Neu

    @VaporiZed
    Du musst schon die Exception-Meldung an das SubForm weitergeben,......

    VB.NET-Quellcode

    1. Public ex As New Exception 'Hilfsvariable für Fehlermeldungen

    Das habe ich in einem Modul stehen, dachte es ginge so? hmmmm

    @GerhardW
    Danke ich werde mir dein Code mal ansehen und damit etwas arbeiten.

    Werde dann berichten wie ich klarkomme.

    Neu

    Du hast in Deinem Hauptformular

    VB.NET-Quellcode

    1. Catch ex As Exception
    2. 'SubFormAufruf
    3. End Try
    Bei dem Catch wird eine neue Variable vom Typ Exception erzeugt mit Daten der aufgetretenen Exception befüllt. Diese Variable ex mit all den Daten gibst Du aber nirgends weiter. Und wo Du nun Public ex As New Exception stehen hast, weiß ich nicht. Aber das spielt auch keine Rolle. Denn dort wiederum wird nicht das drinstehen, was in der Zeile Catch ex As Exception in die Variable ex reingestopft wird. Nur weil es 2 Personen mit dem Namen Amelie gibt, steckt doch in der einen nicht das selbe Mittagessen wie in der anderen drin.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.