Benutzer mit den meisten Antworten
String von Form1 in Form2 Nutzen //Visual 2008 c#

Frage
-
Hier mein Form1:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { textBox1.ForeColor = Color.LightBlue; textBox2.ForeColor = Color.LightBlue; } private void textBox2_TextChanged(object sender, EventArgs e) { textBox2.ForeColor = Color.Black; } private void textBox1_TextChanged(object sender, EventArgs e) { textBox1.ForeColor = Color.Black; } private void button1_Click_1(object sender, EventArgs e) { string player1 = textBox1.Text; string player2 = textBox2.Text; Form2 oForm2 = new Form2(this); //neues Objekt oForm2.ShowDialog(); //aufrufen der Form Close(); } } }
und hier mein Form2:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form2 : Form { public Form2(Form f) { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { player1 = label1.Text ; } } }
nun erkennt form2 den string "player1" nicht. wie bekomm ich das hin?
Antworten
-
Hallo,
in deinem Code musst du noch einiges abändern damit es funktioniert.
Zunächst hast du die unschöne Variante gewählt dass du die Instanz von Form1 an Form2 übergibst. Dadurch müssen beide Klassen einander kennen was den Code schnell unübersichtlich werden lässt. Besser wäre es statt der Form nur die benötigten Daten zu übergeben.
Davon abgesehen, folgendes musst du ändern:
- Nehme Form1 und nicht die Basisklasse Form im Konstruktor der 2. Form entgegen. Nur so kannst du später auf Elemente der Form1 zugreifen, die die Form-Klasse nicht hat. (Code siehe 2.)
- Speichere die Instanz der Form1 in Form2:
Form1 frm; public Form2(Form1 f) { this.frm = f; InitializeComponent(); }
- Erstelle eine öffentliche Eigenschaft in Form1 um den Wert von Player1 abzurufen.
public string Player1{ get{ return textBox1.Text; } set{ textBox1.Text=value; } }
- Greife über die gespeicherte Instanz von Form1 auf die Eigenschaft zu (in Form2):
private void Form2_Load(object sender, EventArgs e) { var player1 = frm.Player1; //dein Code }
Wenn du es nun noch ordentlich machen willst:
- Übergebene nicht die Instanz von Form1 an Form2 sondern lediglich die Strings aus den TextBoxen
- Benenne deine Controls und Formen ordentlich
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets
- Bearbeitet Tom Lambert (Koopakiller)Moderator Dienstag, 10. Mai 2016 16:26
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Mai 2016 07:03
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 3. Juni 2016 06:08
- Nehme Form1 und nicht die Basisklasse Form im Konstruktor der 2. Form entgegen. Nur so kannst du später auf Elemente der Form1 zugreifen, die die Form-Klasse nicht hat. (Code siehe 2.)
-
Solltest du aber immer nur einen String für (nicht pro) Form1 speichern versuche es mit einer public static string variablen_name; variable diese kannst du von überall mit: Form1.variablen_name aufrufen. Noch so ein Tipp am Rande sowas mach ich immer mit einer extra Vars Klasse.
z.B.:
public class Vars { public static string var1 = "dein gewünschter wert"; }
und zugreifen mit:
string string_aus_der_variable = Vars.var1;
bzw ändern mit:
Vars.var1 = "Neuer gewünschter wert";
Dadurch hat Vars.var1 immer den gleichen wert.
Man kann in der Vars Klasse dann auch alle Forms speichern z.B.:
public partial class Form1 : Form { public Form1() { Vars.f1 = this; } }
Und in Vars:
public class Vars { public static Form1 f1= null; }
Nur noch vor der verwendung prüfen ob Vars.f1 != null ist und es kann los gehen.
TIPP: Sollte Vars.f1 = null sein wurde noch kein Form1 object erstellt^^
My website: http://www.dragonskills99.16mb.com
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Mai 2016 07:05
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 3. Juni 2016 06:09
Alle Antworten
-
Hi King,
ein König unter den Programmieren sollt das eigentlich wissen?Zwischen den Befehlen:
Form2 oForm2 = new Form2(this); //neues Objekt oForm2.ShowDialog(); //aufrufen der Form
musst Du der Instanz oForm2 den Inhalt von player1 mitteilen, da das Objekt, auf das oForm2 verweist, gekapselt ist. Für die Übergabe gibt es verschiedene Wege. Du kannst in der Klasse Form2 eine öffentliche (public) Eigenschaft einbauen, die vor ShowDialog beschrieben wird. In Form2 greifst Du dann auf diese Eigenschaft zu, z.B. so:
Form2 oForm2 = new Form2(this); //neues Objekt oForm2.Player1 = player1; oForm2.ShowDialog(); //aufrufen der Form
public string Player1 { get; set; } private void Form2_Load(object sender, EventArgs e) { player1 = this.Player1 ; } }
--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Kommas richtig setzen!
Schüler sagen, Lehrer haben es gut.
Schüler, sagen Lehrer, haben es gut -
Hallo,
in deinem Code musst du noch einiges abändern damit es funktioniert.
Zunächst hast du die unschöne Variante gewählt dass du die Instanz von Form1 an Form2 übergibst. Dadurch müssen beide Klassen einander kennen was den Code schnell unübersichtlich werden lässt. Besser wäre es statt der Form nur die benötigten Daten zu übergeben.
Davon abgesehen, folgendes musst du ändern:
- Nehme Form1 und nicht die Basisklasse Form im Konstruktor der 2. Form entgegen. Nur so kannst du später auf Elemente der Form1 zugreifen, die die Form-Klasse nicht hat. (Code siehe 2.)
- Speichere die Instanz der Form1 in Form2:
Form1 frm; public Form2(Form1 f) { this.frm = f; InitializeComponent(); }
- Erstelle eine öffentliche Eigenschaft in Form1 um den Wert von Player1 abzurufen.
public string Player1{ get{ return textBox1.Text; } set{ textBox1.Text=value; } }
- Greife über die gespeicherte Instanz von Form1 auf die Eigenschaft zu (in Form2):
private void Form2_Load(object sender, EventArgs e) { var player1 = frm.Player1; //dein Code }
Wenn du es nun noch ordentlich machen willst:
- Übergebene nicht die Instanz von Form1 an Form2 sondern lediglich die Strings aus den TextBoxen
- Benenne deine Controls und Formen ordentlich
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets
- Bearbeitet Tom Lambert (Koopakiller)Moderator Dienstag, 10. Mai 2016 16:26
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Mai 2016 07:03
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 3. Juni 2016 06:08
- Nehme Form1 und nicht die Basisklasse Form im Konstruktor der 2. Form entgegen. Nur so kannst du später auf Elemente der Form1 zugreifen, die die Form-Klasse nicht hat. (Code siehe 2.)
-
Solltest du aber immer nur einen String für (nicht pro) Form1 speichern versuche es mit einer public static string variablen_name; variable diese kannst du von überall mit: Form1.variablen_name aufrufen. Noch so ein Tipp am Rande sowas mach ich immer mit einer extra Vars Klasse.
z.B.:
public class Vars { public static string var1 = "dein gewünschter wert"; }
und zugreifen mit:
string string_aus_der_variable = Vars.var1;
bzw ändern mit:
Vars.var1 = "Neuer gewünschter wert";
Dadurch hat Vars.var1 immer den gleichen wert.
Man kann in der Vars Klasse dann auch alle Forms speichern z.B.:
public partial class Form1 : Form { public Form1() { Vars.f1 = this; } }
Und in Vars:
public class Vars { public static Form1 f1= null; }
Nur noch vor der verwendung prüfen ob Vars.f1 != null ist und es kann los gehen.
TIPP: Sollte Vars.f1 = null sein wurde noch kein Form1 object erstellt^^
My website: http://www.dragonskills99.16mb.com
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Mai 2016 07:05
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 3. Juni 2016 06:09
-
Hallo King of Meeseeks,
hast Du das von DragonSkills99 vorgeschlagene Verfahren ausprobiert?
Gruß
Aleksander
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.