Abgeteilt von Wie kann ich im WPF mich an einer Datenbank einloggen und die Daten anzeigen?
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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.
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/
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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
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
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.
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
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.
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.