Auf Variable eines Windows zugreifen(WPF)

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    Auf Variable eines Windows zugreifen(WPF)

    Hallo Ihr lieben,

    wenn ich unter winforms in einer Form etwas Deklariere z.B. Public Sonstwas as new Wasauchimmer dann kann ich aus anderen Formen darauf zugreifen. Der WPF scheint das nicht zu schmecken. Wie kann ich das denn unter WPF machen ?
    Ja ich weiss ist nicht OOP usw. aber das krieg ich bei der WPF einfach nicht auf die reihe, also muss halt der CodeBehind her, aber wie kann ich dann Fensterübergreifend die selben Veriablen verwenden ?

    LG
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Hallo,

    wie sieht denn dein bisheriger Code aus?
    Sowohl in der Form, in der die Variable definiert ist, als auch in der Form, von der du auf sie zugreifen willst.

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    Ich habe eine Klasse mit namen Backend

    im Mainwindows also ganz klar :

    VB.NET-Quellcode

    1. Dim Back as New Backend


    Unter forms kann ich nun in einer anderen Form sagen z.B.

    VB.NET-Quellcode

    1. Form1.Back.Irgendeine Property


    Versuche ich dies nun unter WPF mit:

    VB.NET-Quellcode

    1. MainWindow.Back.DB_KundeAdd(New Kunde With {.KundeVorName = txbKundenVorname.Text, .KundeNachName = txbKundenNachname.Text})


    dann meckert er : Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler BC30469 Der Verweis auf einen nicht freigegebenen Member erfordert einen Objektverweis. HappyFeetsDB E:\Programmieren\Visual\HappyFeetsDB\HappyFeetsDB\HappyFeetsDB\KundenVerwaltenWindow.xaml.vb 10 Aktiv
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    Dim Back as New Backend

    Probiere mal das Feld als public zu definieren und mache es zu einem Property
    Weiß aber nicht ob es funktioniert, da ich den Fehler mit deinen Angaben nicht nachvollziehen kann.

    VB.NET-Quellcode

    1. Public Property Back as New Backend


    Am besten wäre es aber, wenn du eine Singleton Klasse anlegst, in der du dieses Property speicherst.
    Auf diese Klasse (und nartürlich auch auf das Property) kannst du dann im gesamten Code zugreifen.

    Wenn du dazu Fragen hast, frag einfach. Weil das wäre eindeutig der elegantere Weg.

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    Halt Leute.

    Was AsusDK da machen will zeigt schonmal das er unter WinForms wohl vermutlich auch Option Strict Off programmiert denn auch unter WinForms greift man nicht mit Form1.blabla zu sondern über eine Variable, also eine Instanz.

    Denn fakt ist mal das dies unter WPF im Grunde überhaupt nicht anders funktioniert als unter WinForm. Warum auch. Das System der CodeBehind ist hier nicht anders aufgebaut.

    Erstelle eine Instanz eines zweiten Window und übergebe diesem deine Variable. Ob über einen eigenen Kostruktor oder ein Public Property oder ein Public Field ist egal. Dann hast du in deinem zweiten Fenster auch dein Property zur Verfügung.

    PS: Kannst du mir mal verraten warum du das nicht im WPF Bereich Postest????

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo,

    ich würde aber so ein Objekt, was man immer wieder benötigt in einer Singleton Klasse die man z.B dataServie oder so nennt, ablegen, weil man sie dann immer ohne Probleme überall zur Verfügung hat. Weil hier geht es ja anscheinend um ein Objekt, was Daten aus einer Datenbank bereitstellt.

    Oder habe ich hier einen Denkfehler drinne?

    Viele Grüße
    Florian
    ----

    WebApps mit C#: Blazor
    Aber warum dann nicht immer neu instanziieren? Ich meine was soll an so einer Klasse dran sein das dies nicht möglich wäre.

    Mit Singleton muss man immer gaaanz vorsichtig sein.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    MainWindowXaml:

    VB.NET-Quellcode

    1. Public Class MainWindow
    2. Public WithEvents Back As New Backend(True)
    3. Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    4. For Each aft As Auftrag In Back.AuftragsListe
    5. lstb_Auftraege.Items.Add(aft)
    6. Next
    7. End Sub
    8. Private Sub Kundenverwaltung_Click(sender As Object, e As RoutedEventArgs) Handles kundenverwaltung.Click
    9. Dim KNDAnlage As New KundenVerwaltenWindow
    10. KNDAnlage.ShowDialog()
    11. End Sub
    12. Private Sub Auftragsanalge_Click(sender As Object, e As RoutedEventArgs) Handles auftragsanalge.Click
    13. End Sub
    14. End Class



    KundeVerwaltenXaml:

    VB.NET-Quellcode

    1. Imports Mainwindow
    2. Public Class KundenVerwaltenWindow
    3. Private Sub OkButton_Click(sender As Object, e As RoutedEventArgs) Handles OkButton.Click
    4. If txbKundenVorname.Text <> "" AndAlso txbKundenNachname.Text <> "" Then
    5. MainWindow.Back.DB_KundeAdd(New Kunde With {.KundeVorName = txbKundenVorname.Text, .KundeNachName = txbKundenNachname.Text})
    6. 'Kunden.AlleKunden.Add(New Kunde With {.KundeVorName = txbKundenVorname.Text, .KundeNachName = txbKundenNachname.Text})
    7. End If
    8. End Sub
    9. End Class


    Das funktioniert wie gesagt unter WPF leider nicht, unter Forms schon.


    BackendKlasse:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Backend
    3. Public KundenlistePfad As String = System.AppDomain.CurrentDomain.BaseDirectory & "\hfkd.dbxml"
    4. Public AuftragsListePfad As String = System.AppDomain.CurrentDomain.BaseDirectory & "\hfad.dbxml"
    5. Public KundenListe As New List(Of Kunde)
    6. Public AuftragsListe As New List(Of Auftrag)
    7. Public Event KundenListeChanged()
    8. Public Event AuftragsListeChanged()
    9. Public Sub New(WithEntries As Boolean)
    10. Select Case WithEntries
    11. Case True
    12. For i As Integer = 0 To 9
    13. Dim tmp_aft As Auftrag = New Auftrag(DateTime.Now.Date, 20)
    14. DB_AuftragAdd(tmp_aft)
    15. Next
    16. Case Else
    17. End Select
    18. End Sub
    19. #Region "Load"
    20. Sub DB_KundenFileToList()
    21. If File.Exists(KundenlistePfad) Then
    22. KundenListe = DeSerialize(KundenlistePfad, KundenListe)
    23. End If
    24. End Sub
    25. Sub DB_AuftragsFileToList()
    26. If File.Exists(AuftragsListePfad) Then
    27. AuftragsListe = DeSerialize(AuftragsListePfad, AuftragsListe)
    28. End If
    29. End Sub
    30. #End Region
    31. #Region "Save"
    32. Public Sub DB_KundenListToFile()
    33. Serialize(Of List(Of Kunde))(KundenlistePfad, KundenListe)
    34. End Sub
    35. Public Sub DB_AuftragsListToFile()
    36. Serialize(Of List(Of Auftrag))(AuftragsListePfad, AuftragsListe)
    37. End Sub
    38. #End Region
    39. #Region "Sort"
    40. Public Sub DB_KundeSortList()
    41. Dim TMP_List As New List(Of Kunde)
    42. TMP_List = KundenListe.OrderBy(Function(S) S.getKundeFullName).ToList
    43. KundenListe = TMP_List
    44. RaiseEvent KundenListeChanged()
    45. End Sub
    46. Public Sub DB_AuftragSortList()
    47. Dim TMP_List As New List(Of Auftrag)
    48. TMP_List = AuftragsListe.OrderBy(Function(S) S.Auftragsdatum).ToList
    49. AuftragsListe = TMP_List
    50. RaiseEvent AuftragsListeChanged()
    51. End Sub
    52. #End Region
    53. #Region "Add/Edit/Remove"
    54. Public Sub DB_KundeAdd(knd As Kunde)
    55. KundenListe.Add(knd)
    56. DB_KundeSortList()
    57. End Sub
    58. Public Sub DB_KundeEdit(Oknd As Kunde, Nknd As Kunde)
    59. KundenListe.Remove(Oknd)
    60. KundenListe.Add(Nknd)
    61. DB_KundeSortList()
    62. End Sub
    63. Public Sub DB_KundeDelete(knd As Kunde)
    64. KundenListe.Remove(knd)
    65. DB_KundeSortList()
    66. End Sub
    67. Public Sub DB_AuftragAdd(aft As Auftrag)
    68. AuftragsListe.Add(aft)
    69. DB_AuftragSortList()
    70. End Sub
    71. Public Sub DB_AuftragEdit(Oaft As Auftrag, Naft As Auftrag)
    72. AuftragsListe.Remove(Oaft)
    73. AuftragsListe.Add(Naft)
    74. DB_AuftragSortList()
    75. End Sub
    76. Public Sub DB_AuftragDelete(aft As Auftrag)
    77. AuftragsListe.Remove(aft)
    78. DB_AuftragSortList()
    79. End Sub
    80. #End Region
    81. Public Function DB_Kunde_Exists(knd_Name As String) As Boolean
    82. Dim tmp_Bool As Boolean = False
    83. For Each K As Kunde In KundenListe
    84. If knd_Name = K.getKundeFullName Then
    85. tmp_Bool = True : Exit For
    86. End If
    87. Next
    88. Return tmp_Bool
    89. End Function
    90. Public Function DB_Kunde_Exists(knd As Kunde) As Boolean
    91. Dim tmp_Bool As Boolean = False
    92. If KundenListe.Contains(knd) Then
    93. tmp_Bool = True
    94. End If
    95. Return tmp_Bool
    96. End Function
    97. Public Function DB_KundeFromName(knd_name As String) As Kunde
    98. Dim Tmp_K As New Kunde
    99. For Each K As Kunde In KundenListe
    100. If knd_name = K.getKundeFullName Then
    101. Tmp_K = K : Exit For
    102. End If
    103. Next
    104. Return Tmp_K
    105. End Function
    106. End Class




    Aber warum dann nicht immer neu instanziieren?

    Weil ich ja anhand dieser einen Instanz arbeite, darin befinden sich die Listen welche quasi die Datenbank bereitstellen. Ich fände es auch besser wenn ich einfach irgendwo eine "Globale" das komplette Programm übergreifende Instanz erstellen könnte, da ich dazu allerdings nichts finde muss ich die Instanz halt in der Mainform erstellen und aus den anderen Formen darauf zugreifen.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Waswaswaswaaas :?: Da würd ich Dir schon bei WinForms das hier um die Ohren hauen: Dialoge richtig instanziieren
    Das SubForm teilt dem MainForm z.B. über Events Änderungen an demselben mit.
    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.
    @VaporiZed

    Hi, falls du dich hierauf beziehst : KNDAnlage.ShowDialog()
    versuch das unter der WPF mal mit ME in den Klammern--> Funktioniert nicht. Falls du etwas anderes meinen solltest kann ich dir nicht folgen.
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Nee, ich bezieh mich auf Codeblock#2 mit MainWindow.Back.DB_KundeAdd
    Da gehört ein RaiseEvent rein.In CB#1 gehört ab Z#14 (somit) was anderes rein. Statt

    VB.NET-Quellcode

    1. Dim KNDAnlage As New KundenVerwaltenWindow
    2. KNDAnlage.ShowDialog()
    kommt da ein

    VB.NET-Quellcode

    1. Using KNDAnlage As New KundenVerwaltenWindow
    2. AddHandler KNDAnlage.DeinEvent, AddressOf MainSubInDerDasEventVerarbeitetWird
    3. KNDAnlage.ShowDialog()
    4. End Using
    Das Event definierst Du innerhalb von KundenVerwaltenWindow so:

    VB.NET-Quellcode

    1. Public Event DeinEvent As EventHandler(Of DeineEventArgs)
    und dann am besten in ner Extradatei:

    VB.NET-Quellcode

    1. Public Class DeineEventArgs : Inherits EventArgs
    2. Public DeinArgument As DeinDatenTyp
    3. End Class
    und dann wiederum in Main

    VB.NET-Quellcode

    1. Private Sub MainSubInDerDasEventVerarbeitetWird(sender As Object, e As DeineEventArgs)
    2. ' Weiterverarbeitung von e.DeinArgument, z.B. mit Back.DB_KundeAdd()
    3. End Sub

    so aus dem Kopf heraus

    ##########

    btw: in die DeineEventArgs-Klasse muss natürlich nicht nur eine Variable existieren, da können natürlich auch 2, 5, 100 von unterschiedlichen Typen stehen. Eben so, was Du alles und wie Du es später in der Main-Verarbeitungssub (alias EventHandler)brauchst.
    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.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Nofear23m schrieb:

    Kannst du mir mal verraten warum du das nicht im WPF Bereich Postest????

    Möchtest du das bitte noch beantworten?

    asusdk schrieb:

    versuch das unter der WPF mal mit ME in den Klammern--> Funktioniert nicht.

    Doch, funktioniert. Wenn es denn einen Konstruktor gibt der diesen Parameter annimmt. Ist aber unter WinForms doch nicht anders.

    Das du ohne eine Instanz auf eine Form unter WinForms zugreifen kannst ist ein Abwärtskompatiblitätsgerümpel von VB6 Zeiten das MS zum Glück für WPF weggelassen haben.
    Denn bei der Objektorientierten Programmierung darf sowas gar nicht gehen. Du musst ein Objekt instanziieren, erst dann kannst du es verwenden.

    @VaporiZed hat dir eh sehr viele Details hier niedergeschrieben.
    Im Grunde geht es dir ja aber gar nicht um das ganze "Window" welches du im anderen Window benötigst, sondern nur das Backend richtig. Also übergibst du auch nur dieses an das zweite Fenster.

    VB.NET-Quellcode

    1. Class MainWindow
    2. Private _backend As DbBackend
    3. Friend Sub OpenNewWindow()
    4. Dim newWin As New KundenVerwaltenWindow(_backend)
    5. newWin.ShowDialog()
    6. End Sub
    7. End Class


    VB.NET-Quellcode

    1. Public Class KundenVerwaltenWindow
    2. Private ReadOnly _backend As DbBackend
    3. Public Sub New(backend As DbBackend)
    4. ' Dieser Aufruf ist für den Designer erforderlich.
    5. InitializeComponent()
    6. _backend = backend
    7. End Sub
    8. End Class


    Eigendlich ziemlich simpel oder?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Kannst du mir mal verraten warum du das nicht im WPF Bereich Postest????


    Sorry, das ist eine alte Angewohnheit, die ich durchaus mal los werden sollte, hab bisher eigentlich nur im Sonstige Fragen Bereich geschrieben 8|


    Doch, funktioniert. Wenn es denn einen Konstruktor gibt der diesen Parameter annimmt. Ist aber unter WinForms doch nicht anders.

    Naja unter Forms kann ich das ME dahineinpacken, und bislang dachte ich das gehöre auch so, unter wpf sagt er halt das das nicht funktioniert (Ich muss zugeben das ich nichtmal weiss wofür es da ist, hab nur mal gelesen das man das halt da rein packt)


    @VaporiZed
    Darf ich fragen welchen Vorteil ich davon hätte, wenn ich das ganze derart kompliziert mache ? Ich mein gut ich muss zugeben ich verstehe den ganzen OOP-Wahn nicht, da er meiner Erfahrung nach nicht einen einzigen Vorteil, aber ettliche Nachteile mitsich bringt, aber davon mal abgesehen, welcher auch nur ansatzweise nennenswerter Vorteil ergibt sich aus dem ganzen ? Zusätzliches Event nötig, Dann ein Eventhandler und ein Addhandler usw.
    Dafür das es bisher auch immer einwandfrei ohne diesen exorbitanten Mehraufwand funktionierte ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If
    Du solltest mal Anfangen zu lernen. Du merkst ja, du schreibst das du nicht weist wofür gewisse Dinge da sind, wunderst dich aber dann wenn es mal knallt.

    OOP ist kein Wahn. Objektorientiert zu programmieren ist kein Hype oder ein Trend. Es ist Fakt das Vb.Net eine OOP Sprache ist und genau so MUSS(!!!) diese auch angewandt werden.
    Und je früher du dich dem beugst desto besser ist es für dich. Aber du kannst es dir auch selbst schwer machen und so weitermachen. Aber dann kommt bitte nicht wenn beim nächsten mal wieder was nicht klappt nur weil du es nicht lernen wolltest. WinForms "verzeit" einem etwas mehr, WPF ist hier ein wenig konsequenter umgesetzt. Was ich auch gut finde.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    OOP ist kein Wahn. Objektorientiert zu programmieren ist kein Hype oder ein Trend. Es ist Fakt das Vb.Net eine OOP Sprache ist und genau so MUSS(!!!) diese auch angewandt werden.


    Ja aber WARUM, darum geht es mir ja, WARUM OOP, was bringt es mir ausser mehraufwand. Das ist dasselbe wenn meine Mutter früher etwas wollte und ich nach dem Warum gefragt habe "Weil ich es sage". Das gibt mir aber keine Erklärung keinen Grund keinen Sinn... Ich weiss das ich es lernen muss, aber ich will es zuerst Verstehen, welchen auch noch so geringen Vorteil habe ich davon, ich brauche mehr Zeilen Code, ich muss mehr beachten, es ist unüberischtlicher und in Zig Files aufgeteilt, aber wo ist ein Vorteil, was bringt es mir ? Kann mir das Bitte jemand klar darstellen, warum das so sein muss/soll ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:


    Naja unter Forms kann ich das ME dahineinpacken, und bislang dachte ich das gehöre auch so, unter wpf sagt er halt das das nicht funktioniert (Ich muss zugeben das ich nichtmal weiss wofür es da ist, hab nur mal gelesen das man das halt da rein packt)

    Ich mein gut ich muss zugeben ich verstehe den ganzen OOP-Wahn nicht, da er meiner Erfahrung nach nicht einen einzigen Vorteil, aber ettliche Nachteile mitsich bringt, aber davon mal abgesehen, welcher auch nur ansatzweise nennenswerter Vorteil ergibt sich aus dem ganzen ?


    ...und täglich grüßt das Murmeltier...
    Da waren wird doch schon in der Diskussion im Thread WPF Notizbuch ab deinem Eintrag. Mir kommt das so langsam recht unnütz vor weiter zu diskutieren. Ich empfehle wirklich erst mal bei den Einstellungen nochmal nachlesen und vor allem den Visual Basic Namespace zu erntfernen. Dann kommt man langsam aber sicher von allein auf OO Programmierung. wenn das sitzt, dann kann man sich an WPF heranwagen.

    Nachtrag weil ich mal wieder zu spät war und das WARUM gerne mit dem LINK beantworten würde.
    Ich empfehle wirklich erst mal bei den Einstellungen nochmal nachlesen und vor allem den Visual Basic Namespace zu erntfernen


    Inwiefern ? Option Strict is generell auf an, vb-Namespace wird nicht mehr verwendet (schon lange) also was genau mach ich den Einstellungs-Bezogen falsch ?
    If Energy = Low Then
    Drink(aHugeCoffee)
    Else
    Drink(aHugeCoffeeToo)
    End If

    asusdk schrieb:

    Das ist dasselbe wenn meine Mutter früher etwas wollte und ich nach dem Warum gefragt habe "Weil ich es sage"

    Und warum ist der Himmel blau. Ich will aber das er grün ist. Warum kann er nicht grün sein? Ist eben so!!
    Du hast dir eine OO Sprache ausgesucht. Fakt. Wenn dir das nicht gefällt musst du dir eine andere Sprache suchen. Da brauche ich nicht zu Diskutieren warum und weshalb.

    Warum heisst "gut" gut? Im Englischen heißt es ja auch "good". Das gefällt mir besser. Ja, aber du sprichst Deutsch. Ich will aber das man im Deutschen auch "good" sagt anstatt immer dieses doofe "gut".

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @asusdk: Warum mein Weg und nicht Deiner? Weil meins läuft und Deins nicht. Bei der OOP-Grundsatzdiskussion halte ich mich raus, das ist mir zu Offtopic.
    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.