Laden...

Daten zwischen mehreren Fenstern teilen

Erstellt von DerMax vor 4 Jahren Letzter Beitrag vor 3 Jahren 1.482 Views
D
DerMax Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

So, ich habe mich jetzt erstmal von SQL verabschiedet, da ich keinen eigenen Server habe bzw. da ich dies hier hobbymäßig mache möchte ich auch keine Abo Kosten von Anbietern haben.

Ich möchte meinen Daten nun lieber direkt in der Anwendung sichern. Als erstes Programm soll das ja nicht ausufern. Ich möchte erstmal die Grundlagen lernen bevor ich mit SQL ausschweife. Hatte da an eine List und ein DataGrid gedacht.

Folgendes Vorhaben (Beispiel Auszüge):
Fenster 1 = DataGrid (Haushaltsbuch)
Fenster 2 = TextBoxen zum Eingeben der Daten (Name, Betrag etc.)
Klasse = Einnahmen

Wie bekomme ich jetzt die Daten von Fenster 2 in das DataGrid von Fenster 1? Beispiele die ich im Netz gefunden habe verarbeiten die Daten immer im selben Fenster und dann auch im DataGrid direkt. Das möchte ich gerne vermeiden, sodass die Eingaben nur über das "Formular" im zweiten Fenster passieren können. Da war glaube ich was mit Binding. Nur wie binde ich die Daten dann in die Klasse Einnahmen und schicke sie in das DataGrid?

Den Code den ich schon geschrieben habe poste ich mal nicht, ist etwas länger (120 Zeilen für 2 Fenster) und anfängermäßig umständlich 😁
Sollte das nicht zu lang zum Posten sein, sagt es gerne, dann schick ich ihn nach...

Zu meinem ersten Thema im ersten Post (Login über SQL) will ich eurer Programmiererblut schön zum Kochen bringen. Hab die Nutzernamen und Passwörter direkt im Code geschrieben. Ja ich weiß: nix gut aber meine Eltern stört das nicht. Ist ja familienintern 😁

private void btnLogin_Click(object sender, RoutedEventArgs e)
        {
            if (txtUsername.Text == "admin" && pwbPassword.Password == "admin" ||
                txtUsername.Text == "user" && pwbPassword.Password == "user")
                //weitere User anfügen
            {
                MainProgram mainProgram = new MainProgram();
                mainProgram.Show();
                this.Close();
            }
            else
            {
                MessageBox.Show("Benutzername und/oder Passwort falsch!", "UPS, da is was schief gelaufen!", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

Gruß
DerMax

16.834 Beiträge seit 2008
vor 4 Jahren

Beispiele die ich im Netz gefunden habe verarbeiten die Daten immer im selben Fenster und dann auch im DataGrid direkt.

Einfacher Blick in die FAQ: [FAQ] Kommunikation von 2 Forms

Ansonsten als Hinweis, bitte an [Hinweis] Wie poste ich richtig? halten.
Danke.

5.658 Beiträge seit 2006
vor 4 Jahren

So, ich habe mich jetzt erstmal von SQL verabschiedet, da ich keinen eigenen Server habe bzw. da ich dies hier hobbymäßig mache möchte ich auch keine Abo Kosten von Anbietern haben.

Datenbanken verursachen keine Kosten, außer du läßt sie irgendwo hosten oder verwendest lizenzpflichtige Systeme wie Oracle.

Wie bekomme ich jetzt die Daten von Fenster 2 in das DataGrid von Fenster 1?

Am einfachsten geht das, wenn man MVVM benutzt. Dann kann man fensterübergreifend auf das gleiche ViewModel zugreifen, und die Daten anzeigen bzw. bearbeiten.

Siehe dazu [Artikel] MVVM und DataBinding

Bitte beachte zukünftig [Hinweis] Wie poste ich richtig?, besonders:
1.2 Nur ein Thema pro Thread
2.1 Im richtigen Forum posten
6. Code-Tags und Anhänge verwenden

Weeks of programming can save you hours of planning

309 Beiträge seit 2020
vor 4 Jahren

Du kannst auch einfach eine static Klasse machen mit einer List<Einnahme>() auf die beide Formen zugreifen können.
Die kannst du dann serialisieren/deserialisieren um die Daten lokal zu speichern.
Mit nem DataGridView auf jeder Form mit jeweils der Liste als DataSource kannst du es auch einfach bearbeiten.

A
764 Beiträge seit 2007
vor 4 Jahren

Du kannst auch einfach eine static Klasse machen mit einer List<Einnahme>() auf die beide Formen zugreifen können.

Bitte nicht, vor allem nicht zustandsbasiert.

Siehe Beispielsweise hier:
https://blog.aspiresys.pl/technology/why-static-classes-are-evil/

16.834 Beiträge seit 2008
vor 4 Jahren

Du kannst auch einfach eine static Klasse machen mit einer List<Einnahme>() auf die beide Formen zugreifen können.

Um Alf's Aussage absolut zu bekräftigen: statische Klassen ist genau das, was man für sowas NICHT nutzen soll.

D
DerMax Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

OK, danke für die ganzen Hinweise/Ratschläge.
Viele Informationen die auf einen Anfänger eintrudeln... Aber kann mir evtl jemand direkt helfende Unterstützung geben? Meine Code/meine Codes sehen derzeit so aus (ist bestimmt wild durcheinander wenn man viele verschiedene Quellen abarbeitet und nix richtig funktioniert)

Fenster 1 (Testweise MainWindow bzw Window mit der Tabelle)


public partial class MainWindow : Window
    {
        //Erstelle das Listen Objekt
        List<Einnahme> einnahmen = new List<Einnahme>();

        public MainWindow()
        {
            InitializeComponent();

            //Weise die Einnahmen Liste dem ItemsControl zu
            einnahmenControl.ItemsSource = einnahmen;
        }

        private void btnEinnahme_Click(object sender, RoutedEventArgs e)
        {
            Hinzufügen hinzufügen = new Hinzufügen();
            hinzufügen.Show();
        }
    }

Fenster 2 (Testweise Fenster für das Hinzufügen für Werten)


public partial class Hinzufügen : Window
    {
        public Hinzufügen()
        {
            InitializeComponent();
        }

        private void btnSave_Click(object sender, RoutedEventArgs e)
        {
            
        }

        private void btnReset_Click(object sender, RoutedEventArgs e)
        {
            txtName.Text = "";
            txtBetrag.Text = "";
            txtKommentar.Text = "";
        }

        private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }

Fenster 3 (Klasse Einnahmen)


public class Einnahme
    {
        //Eigenschaften
        //public DateTime Datum { get; set; }
        public string Name { get; set; }
        public double Betrag { get; set; }
        public string Gruppe { get; set; }
        public string Intervall { get; set; }
        public string Kommentar { get; set; }

        //Konstruktor
        public Einnahme(string name, double betrag, string gruppe, string intervall, string kommentar)
        {
            //Datum = datum;
            Name = name;
            Betrag = betrag;
            Gruppe = gruppe;
            Intervall = intervall;
            Kommentar = kommentar;
        }
    }

bin da wohl einfach noch zu blöd zu...

Gruß
DerMax

309 Beiträge seit 2020
vor 4 Jahren

Sorry habe die Frage falsch verstanden.

Du kannst das Hinzufügen-Fenster als Dialog genau wie hier machen:
Vorüberlegung zur Form2Form-Kommunikation: Programm-Design überdenken

5.658 Beiträge seit 2006
vor 4 Jahren

Aber kann mir evtl jemand direkt helfende Unterstützung geben?

Wo genau brauchst du denn Unterstützung? Daß du einfach hier deinen Code postest, und dann darauf wartest, daß ihn jemand für dich debuggt oder umschreibt, so funktioniert ein Forum nicht.

Daher auch _nochmals _der Hinweis auf [Hinweis] Wie poste ich richtig?: 5. Problem genau beschreiben - inkl. genauer Fehlermeldung - und konkrete Fragen stellen

Weeks of programming can save you hours of planning

187 Beiträge seit 2009
vor 4 Jahren

Du könntest ein Ereignis definieren, dass in Hinzufügen ausgelöst wird und im MainWindow abboniert wird. In den EventArgs sind die hinzuzufügenden Werte enthalten.

D
DerMax Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

Wo genau brauchst du denn Unterstützung? Daß du einfach hier deinen Code postest, und dann darauf wartest, daß ihn jemand für dich debuggt oder umschreibt, so funktioniert ein Forum nicht.

nein natürlich nicht. Ich weiß schon wie ein Forum funktioniert. Ich erörtere es aber gerne nochmal:

Ich bin blutiger Anfänger und bringe mit gerade selber das Programmieren bei. Da ich es mit selber beibringe habe ich direkt keinen Lehrer oder Ausbilder. Deshalb habe ich mich an Leute gewendet, die schon erfahrener sind als ich mit der Hoffnung hier helfende Unterstützung zu bekommen. Dafür ist ja ein Forum da. Natürlich sollt Ihr mir das Programm nicht schreiben, das will ich selber. Ich will es ja lernen. Die Theorie verstehe ich schon sehr gut, nur harperts bei mir noch mit dem abstrakten denken und die Theorie in die Praxis umzusetzen. Auch scheine ich mich nicht passend genug auszudrücken, denn alle gut gemeinten Ratschläge verlaufen ins Leere. Mag sein das ich mich nicht richtig ausdrücken kann, mag auch sein das ich die Tipps nicht ganz verstehe. DESHALB habe ich mein Code (welcher nicht das gesamte Programm beinhaltet, nur den Bereich der Dateneingabe) gepostet, damit ihr besser versteht, auf welchem Stand ich bin und was aktuell mein Problem ist. Auch damit Ihr mir sagen könnt: das hast du falsch gemacht, das hast du falsch gemacht, das macht man anders, mach das mal so... Ich habe den Code auch gepostet weil ich schon über einem verf#####(nicht jugendfreier Ausdruck) Monat versuche den Sche## zum Laufen zu bringen. Aber nichts funktioniert. Und glaubt mir, ich habe schon viiiiiiiiiiel im Netz recherchiert.

Wenn ich mich einfach nur falsch ausgedrückt habe, tut es mir leid

Für eure Ratschläge/Tipps (auch die von JimStark und Caveman) bedanke ich mich. Ich werde dies dann alles versuchen umzusetzen.

Gruß
DerMax

309 Beiträge seit 2020
vor 4 Jahren

Wenn du dafür schon so viel Zeit aufbringst wäre es vielleicht eine gute Idee ein Buch/Tutorial, etc. zu den Grundlagen durch zu machen.

Wo ist jetzt genau dein Problem?

Mach die "Hinzufügen"-Form einfach als Dialog,
Also:


            Hinzufügen hinzufügen = new Hinzufügen();
            hinzufügen.ShowDialog(); // Abfragen etc. wie im Beispiel
...
            einnahme = hinzufügen.myEinnahme;


Und in der Hinzufügen Form gibst du statt den "Password"-String ein Einnahme Objekt zurück:


      public Einnahme myEinnahme {
         get { return new Einnahme(){...}; }
      }

Du kannst das Beispiel aus dem Link fast 1:1 übertragen, dann brauchst du dich um den externen Zugriff auf die Liste nicht kümmern.

Z
12 Beiträge seit 2020
vor 3 Jahren

Hallo Max,

ich bin ebenfalls Anfänger(im fortgeschrittenen Alter) und rate dir, dich mit mvvm, xaml und Co zu beschäftigen, wenn auch vielleicht nicht unbedingt mit den Tutorials hier im Forum, die sind für Anfänger zu fortgeschritten, sind eher was für fortgeschrittene Anfänger die sich noch nicht im fortgeschrittenem Alter befinden 😄

Wenn du googelst such beispielsweise nach "Binding data to Textbox" o.ä.
https://www.wpf-tutorial.com/ hat mir relativ gut weitergeholfen. Allerdings ist es nicht hilfreich sich nur das zu holen was man gerade braucht, wenn man nicht die Basis versteht.

Verstehst du die Ojektorientierung mit ihren Properties nicht, kommst du in WPF und Databinding auch nicht weiter.