none
String von Form1 in Form2 Nutzen //Visual 2008 c# RRS feed

  • 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?

    Dienstag, 10. Mai 2016 14:45

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:

    1. 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.)
    2. Speichere die Instanz der Form1 in Form2:
      Form1 frm;
      public Form2(Form1 f)
      {
          this.frm = f;
          InitializeComponent();
      }


    3. Erstelle eine öffentliche Eigenschaft in Form1 um den Wert von Player1 abzurufen.
      public string Player1{
        get{
          return textBox1.Text;
        }
        set{
          textBox1.Text=value;
        }
      }

    4. 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:

    1. Übergebene nicht die Instanz von Form1 an Form2 sondern lediglich die Strings aus den TextBoxen
    2. 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



    Dienstag, 10. Mai 2016 16:23
    Moderator
  • 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

    Mittwoch, 18. Mai 2016 12:51

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

    Dienstag, 10. Mai 2016 15:27
  • Leider nicht im Programmieren^^

    aber dankeschön :) 

    es klappt allerdings immernoch nicht so ganz :/ magst du das alles kurz in meinen Orginalcode Klatschen? wäre echt super,

    Vielen lieben dank schonmal :)

    Dienstag, 10. Mai 2016 15:40
  • 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:

    1. 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.)
    2. Speichere die Instanz der Form1 in Form2:
      Form1 frm;
      public Form2(Form1 f)
      {
          this.frm = f;
          InitializeComponent();
      }


    3. Erstelle eine öffentliche Eigenschaft in Form1 um den Wert von Player1 abzurufen.
      public string Player1{
        get{
          return textBox1.Text;
        }
        set{
          textBox1.Text=value;
        }
      }

    4. 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:

    1. Übergebene nicht die Instanz von Form1 an Form2 sondern lediglich die Strings aus den TextBoxen
    2. 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



    Dienstag, 10. Mai 2016 16:23
    Moderator
  • 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

    Mittwoch, 18. Mai 2016 12:51
  • 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.

    Montag, 23. Mai 2016 06:39