Warum kann ich keine Property einer Form abfragen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von jan99.

    Warum kann ich keine Property einer Form abfragen

    Moin!

    bisher habe ich eigentlich immer wie folgt gemacht um das Ergebnis von einer Form zu bekommen.

    VB.NET-Quellcode

    1. Public Class frm_OfficeSaveDigiGsewAkte
    2. Private _FullFileName As String = ""
    3. ''' <summary>
    4. ''' Abfrage des neuen Dateinamen
    5. ''' </summary>
    6. ''' <returns>neuer Dateiname oder LEERSTRING</returns>
    7. Public ReadOnly Property NewFileFullName As String
    8. Get
    9. Return _FileFullName
    10. End Get
    11. End Property
    12. ''' <summary>
    13. ''' speichern der Datei
    14. ''' </summary>
    15. Private Sub bt_action_Click(sender As Object, e As EventArgs) Handles bt_action.Click
    16. Me.Close()
    17. End Sub


    Aufgerufen wird die Form wie folgt und nach dem Show der Wert des Pfad abgefragt:

    VB.NET-Quellcode

    1. Public Function Show() As String
    2. Dim f As New frm_OfficeSaveDigiGsewAkte(_DatumDoc, _GrdStkPfad, _Lagebezeichnung, _FID_GrdStk, _Anwendung)
    3. With f
    4. .ShowDialog()
    5. Return .NewFileFullName ' neuer Dateiname oder LEERSTRING bei Abbruch
    6. End With
    7. Return ""
    8. End Function


    Es wird nun als String immer ein LEERSTRING zurück gegeben.

    Wenn ich in die Überwachung "_FileFullName" setze dann wird mir auch der richtige Wert angezeigt.

    Setze ich einen Haltepunkt in die Zeile 21 des ersten Code-Block, dann wird mit dem Wechsel von Zeile 20 auf Zeile 21 der Wert von "richtig" auf LEERSTRINg gesetzt.

    Irgendwie habe ich das Gefühl eine dickes Brett vor dem Kopf zu haben.

    Kann mir einer das Brett "abnehmen"?

    Jan

    jan99 schrieb:

    VB.NET-Quellcode

    1. .ShowDialog()
    gibt bei Abbruch DialogResult.Cancel zurück.
    Wenn Du in Deinem Dialog einen OpenFileDialog als Sub-Dialog aufrufst, musst Du da Deine Property belegen, siehe Post von @HenryV .
    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!

    jan99 schrieb:

    verstehe ich es richtig, eine Property liefert nur Werte zurück, wenn diese vor dem Aufrufen auch gesetzt wurden?


    Nein. Du initialisierst das Feld ja leer: Private _FullFileName As String = "". Das gibt er dir wieder. Du hast nur irgendwo einen blöden Fehler, dass du das falsche Feld setzt, oder die Form neu machst und bekommst das Anscheint nicht richtig Debugged.
    Also _FullFileName hat in dem gesamten Dialog einmal einen Wert bekommen.

    Deshalb hatte ich auch

    Setze ich einen Haltepunkt in die Zeile 21 des ersten Code-Block, dann wird mit dem Wechsel von Zeile 20 auf Zeile 21 der Wert von "richtig" auf LEERSTRINg gesetzt.

    beschrieben.

    Gruß jan

    jan99 schrieb:

    verstehe ich es richtig
    Eine solche Frage mit 1263 Posts im Forum X(
    Fülle bei dem Haltepunkt die Variable manuell.
    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!

    Bluespide schrieb:

    Wo ist denn _FileFullName deklariert, denn die Variable darüber ist es ja nicht:

    vb-paradise.de/index.php/Attac…4c6e3e72b06d51689379b79d8


    Moin!

    ok, da war ein Fehler den ich jetzt behoben habe.

    Nun sieht das ganze wieder so aus ...

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Public Class frm_OfficeSaveDigiGsewAkte
    3. Private _FileFullName As String = ""
    4. ''' <summary>
    5. ''' Abfrage des neuen Dateinamen
    6. ''' </summary>
    7. ''' <returns>neuer Dateiname oder LEERSTRING</returns>
    8. Public ReadOnly Property NewFileFullName As String
    9. Get
    10. Return _FileFullName
    11. End Get
    12. End Property
    13. ' an irgendeiner Stelle wird _FileFullName mit einem Wert belegt
    14. ''' <summary>
    15. ''' speichern der Datei
    16. ''' </summary>
    17. Private Sub bt_action_Click(sender As Object, e As EventArgs) Handles bt_action.Click
    18. Me.Close()
    19. End Sub
    20. End Class



    Aber wenn ich den Code durchlaufe, dann ist in Zeile 23 ...



    .. und eine Zeile weiter ...



    ist "_FileFullName" leer. Dann kann die Propertie auch keinen Wert übergeben ungleich Leerstring.

    Eigentlich sollte doch der Wert noch bis zum Auflösen der Form in Zeile 7 erhalten bleiben und über die Property verfügbar sein.

    VB.NET-Quellcode

    1. Public Function Show() As String
    2. Dim Path As String = ""
    3. Dim f As New frm_OfficeSaveDigiGsewAkte(_DatumDoc, _GrdStkPfad, _Lagebezeichnung, _FID_GrdStk, _Anwendung)
    4. With f
    5. .ShowDialog()
    6. Path = .NewFileFullName ' neuer Dateiname oder LEERSTRING bei Abbruch
    7. End With
    8. Return Path
    9. End Function


    ?!?!?!

    Irgendwie stehe ich so richtig auf dem Schlauch.

    Jan
    @jan99 Poste mal Dein Projekt oder ein kleines Testprojekt, das den Effekt reproduziert.
    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!
    Verwende nicht Me.Close sondern Me.DialogResult.Ok

    Bei Me.Close wird alles innerhalb der FOrm verworfen:
    learn.microsoft.com/de-de/dotn…e?view=windowsdesktop-7.0

    Und rufe die Form folgendermaßen auf:

    VB.NET-Quellcode

    1. Using f As New frm_OfficeSaveDigiGsewAkte(_DatumDoc, _GrdStkPfad, _Lagebezeichnung, _FID_GrdStk, _Anwendung)
    2. With f
    3. If .ShowDialog() = Dialogresult.Ok
    4. Return .NewFileFullName ' neuer Dateiname oder LEERSTRING bei Abbruch
    5. End If
    6. End With
    7. End Using


    LG
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Moin!

    ich glaube ich werde gleich gesteinigt.

    Auch mit den letzten Ansätzen hat es nicht geklappt. Also nochmal durch den Code geblättert und gesucht, wo _FileFullName den Leerstring zugewiesen bekommt.

    Da gab es dann die Stelle

    VB.NET-Quellcode

    1. Private Sub bt_Cancel_Click(sender As Object, e As EventArgs) Handles bt_Cancel.Click, Me.FormClosing
    2. _FileFullName = "" ' Bei Abbruch gibt es keinen Namen
    3. End Sub


    .... und das Problem war Me.FormClosing, wenn die Maske geschlossen wird.

    Danke dennoch für die Unterstützung.

    Jan