| Autor |
Beitrag |
cptjmiller
Hält's aus hier
Beiträge: 6
|
Verfasst: Sa 13.10.07 18:18
Hallo mal wieder...
ich stricke mir derzeit eine Windows-Forms-GUI-Anwendung zusammen...
Nun bin ich an einem Punkt angelangt, wo ich nicht mehr weiter weiß...
Wie kann ich Daten von einer Forms zur nächsten Transportieren??
Beispiel:
Ich habe eine Anwendung, die in einer einzigen Mainform ausgeführt wird...
Innerhalb dieser kann ich alle meine Variablen und damit Daten wunderbar ansprechen...
Nun habe ich dieser Anwendung noch eine zweite Form vorgeschalten (einen Login-Screen).
Nun würde ich gerne z.B. den Benutzernamen, mit dem sich der User im Login-Screen einloggt, auch in MainForm z.B. anzeigen können...d.h. ich möchte die Daten in etwas hinterlegen, was physisch zwar zur Login-Form gehört, aber auf das ich auch in der MainForm zugreifen kann...
Hab's schon mit public Variablen, abstrakten und statischen Variablen probiert...klappt nicht...
Ich hab immer gedacht, solange der Namespace identisch ist, kann ich - zumindest auf public-Elemente - überall zugreifen...
Ist das überhaupt möglich, was ich da vorhabe? Und wenn ja...wie stelle ich das an?
Ich suche sozusagen einen GLOBALEN DATENSPEICHER, auf den ich von jeder Forms aus zugreifen kann...
Danke für Eure Hilfe...
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Sa 13.10.07 18:47
Globale Variablen gibt's in C# nicht und das ist auch gut so. Ich hatte bisher keine Gelegenheit, wo ich nicht ein deutlich saubereres Design gefunden habe, welches ohne globale Variablen auskommt.
Was Du beim Login machen kannst, ist, einen Dialog wie z.B. den OpenDialog zu machen. Du gibst Deiner Login-Form also die Eigenschaften "Username" und "Password". Aufruf geht dann so:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| LoginForm loginForm = new LoginForm(); string username; string password; if (loginForm.ShowDialog() == DialogResult.OK) { username = loginForm.Username; password = loginForm.Password; } |
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Xardas008
      
Beiträge: 149
Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
|
Verfasst: Mi 14.11.07 16:38
Hallo cptjmiller,
ich kann dein Problem sehr gut nachvollziehen, da ich vor dem selben Problem stehe.
Und zwar sieht das bei mir wiefolgt aus: Ich habe ein Fenster, wo ich z.B. eine Adresse anlege, und ein anderes, welche sie wieder anzeigt.
Bis jetzt bin ich nur auf 2 Wege gekommen, diese Daten von Fenster A nach Fenster B zu transportieren, ohne dass der User in eine Datei speichert (also dass er es mitbekommt).
1. Möglichkeit: Ich schreibe diese Daten in eine Temporäre Datei und lade diese wieder aus dem anderen Fenster heraus.
Problem hierbei: Es ist auf die Zeit Performancelastig, da ständig Festplattenzugriff vorhanden ist beim lesen/schreiben.
Zudem wird es knifflig wenn du auf diese Weise später ca 20 Fenster hast die diese Daten brauchen kommt viel redundanter Code hinzu der sich sicher vermeiden lässt (ok ne statische Klasse wo das Speichern/Laden drin steht ist nötig, aber du hast ständig die Methodenaufrufe)
Und die 2. Möglichkeit: Du schreibst die Daten in eine Datenbank hinein. Dies ist eine elegante Möglichkeit wenn diese Variante in dem Projekt auf jeden Fall geplant ist, als Beispiel sei mal eine kleine ERP Software gemeint die auf Datenbankzugriff baut und gleichzeitig Serverbasiert entwickelt ist.
Das Problem dieser Möglichkeit ist aber, dass du nicht jedem Programm gleich eine Datenbank mitliefern möchtest.
Daher auch von mir die Frage (da sie gerade super zum Thema passt), wie kann man die Daten eleganter von Form1 nach Form2 transportieren.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 14.11.07 16:42
Ich werfe dann mal die Möglichkeit in den Raum, die ich aufgezeigt habe und welche auch von den Dialogen des Frameworks genutzt wird. Siehe mein Posting oben 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Xardas008
      
Beiträge: 149
Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
|
Verfasst: Mi 14.11.07 17:09
Kann ich das ganze so verstehen, das ich nur eine Klasse definieren muss die die Eigenschaften der Felder hat, die ich dort abfragen muss oder muss ich das als eigenes Fenster "designen" wie alles andere auch. Wenn ich das mit dem FormDesigner vom Visual Studio erst erstellen kann wie es auszusehen hat, dann werde ich das auf jeden Fall mal ausprobieren.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 14.11.07 17:14
Der Formdesigner erstellt ja für Dein Fenster eh eine Klasse, welche von Form abgeleitet ist. Alles, was für den Formdesigner interessant ist, kommt ja (dank partial classes) eh in eine separate Datei. In dem Teil der Klasse, wo Du auch Deine Events etc. einbaust, kannst Du problemlos weitere Eigenschaften definieren, ohne dass sich der Formdesigner dran stört.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Xardas008
      
Beiträge: 149
Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
|
Verfasst: Mi 14.11.07 17:24
Christian S. hat folgendes geschrieben: | | Der Formdesigner erstellt ja für Dein Fenster eh eine Klasse, welche von Form abgeleitet ist. Alles, was für den Formdesigner interessant ist, kommt ja (dank partial classes) eh in eine separate Datei. In dem Teil der Klasse, wo Du auch Deine Events etc. einbaust, kannst Du problemlos weitere Eigenschaften definieren, ohne dass sich der Formdesigner dran stört. |
Ok das ist soweit ja klar dass ich da alles mögliche dazuprogrammieren kann.
Also habe gerade folgendes ausprobiert: Habe in Form1 ein Label und einen Button, über den Button rufe ich Form2 genau so auf wie du es oben beschreibst, funktioniert soweit auch.
Nur eins habe ich noch nicht raus, wie gebe ich die Werte zurück.
Theoretisch muss ich die Eigenschaft doch dann füllen, wenn ich auf den OK Button klicke der dann im Anschluss das Fenster schließt.
So hab ich mal gemacht, und was bekomm ich, nen Fatalerror.
Im Debugger gibts nur die Meldung dass das Springen nicht möglich sei, und zwar in einem Dialogfenster.
Könntest du uns ein kurzes Beispiel von Form 2 liefern wo du die Eigenschaft füllst? Und wie du dann wieder zur Aufrufenden Form springst.
Danke, ich denke dann habe ich das Problem gelöst, muss es mir dann nur irgendwo notieren um es nicht zu vergessen.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Mi 14.11.07 17:38
Gehen wir von folgendem aus:
Form1 hat ein Label (label1) und einen Button (button1).
Form2 hat eine TextBox (textBox1) und einen Button (button1).
Form1 ruft Form2 auf, Nutzer gibt in Form2 etwas in die Textbox ein, klickt OK. Der Text soll in Form1 im Label erscheinen.
Zuerst einmal zu Form2:
Textbox drauf packen, Button drauf packen. Die DialogResult-Eigenschaft des Buttons auf "OK" setzen.
Im Sourcecode eine neue Property anlegen:
C#-Quelltext 1: 2: 3: 4: 5:
| private string input; public string Input { get { return input; } } |
Dann im Click-Ereignis von button1: input = textBox1.Text;
Durch das Setzen des DialogResult des Buttons müssen wir uns ums Schließen der Form nicht mehr kümmern.
Nun Form1:
Label drauf, Button drauf.
Im Click-Ereignis des Buttons folgendes:
C#-Quelltext 1: 2: 3:
| Form2 inputDialog = new Form2(); if (inputDialog.ShowDialog() == DialogResult.OK) label1.Text = inputDialog.Input; |
Das war's
Anmerkungen:
(1) Du kannst Input auch zu einer schreibbaren Eigenschaft machen und vor ShowDialog() den Wert setzen. Den könnte man in der textBox anzeigen. Das ganze geht also auch in die umgekehrte Richtung
(2) In Form2 könnte man wohl auch mit DataBinding arbeiten, aber als Beispiel sollte das hier genügen
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Xardas008
      
Beiträge: 149
Win 7 Professional x64, Ubuntu 10.04, Windows Server 2008 R2
C#, Visual Studio 2008 Pro, Visual Studio 2010 Ultimate, Eclipse (Java)
|
Verfasst: Mi 14.11.07 17:51
Ich danke dir.
Damit dürfte dann auch gleichzeitig die Frage vom Ersteller beantwortet sein, wenn nicht schon vorher geschehen.
Jetzt kann ich endlich richtig mit dem Programmieren loslegen.
|
|
|