Autor Beitrag
Thommy0606
Hält's aus hier
Beiträge: 15

Win XP
C# (VS2008 Express)
BeitragVerfasst: Mi 14.04.10 08:24 
Hallo zusammen

Ich hoffe das ich die richtige Sparte getroffen habe, wenn nicht bitte verschieben.

Folgendes Problem habe ich: Ich möchte in einen Programm mit 2 Forms eine INT Variable vor den öffnen der 2 Form mit einen Wert beschreiben und in einen Label der Form 2 anzeigen. Das Problem besteht darin, das in den Label der Wert 0 angezeigt wird obwohl ich in Form 1 der Variable eigentlich den Wert 35 zuweise. Bitte kann mir jemand erklären was ich falsch mache?! Das Programm ist nur eine Übung. Die technik wird aber später in einen andern größeren Projekt zu Anwendung kommen. wenn ich das ganze mit eigener Membervariable probiere funktion niert das tadellos. Nur nicht mit Interface.

Anbei mal der Code zum drüberschauen. Bin noch Anfäger im eigen Studium also bitte nicht über vielleicht sonderbare Programmierung wundern.


Dies ist der Code für die 2. Form, die die Variable Id2 anzeigen soll.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
public partial class Form2 : Form
    {
        public Form2(Form1 f)
        {
            InitializeComponent();
            this.form1 = f;
        }

        Dataconnection d = new Dataconnection();

        private Form1 form1 = null;
        /*private int id = 0;
        public int Id
        {
            get {return this.id;}
            set { this.id = value; }
        }*/


        private void Form2_Load(object sender, EventArgs e)
        {
            int i = d.Id2;
            this.label1.Text = d.Id2.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.form1.Id = 22;
        }
    }
}


Das ist die "externe" Klasse mit Interface

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
namespace Tatenaustausch
{
    class Dataconnection: IAustausch
    {
        private int id1;
        private int id2;

        public int Id1
        {
            get { return this.id1; }
            set { this.id1 = value; }
        }
        public int Id2
        {
            get { return this.id2; }
            set { this.id2 = value; }
        }

    }
    public interface IAustausch
    {
        int Id1
        {
            get;
            set;
        }
        int Id2
        {
            get;
            set;
        }
    }
}


Form 1 mit Button zum Öffnen von Form 2

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
namespace Tatenaustausch
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Dataconnection d = new Dataconnection();
        

        public int Id
        {
            get { return Convert.ToInt32(this.label1.Text); }
            set { this.label1.Text = value.ToString(); }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2(this);
            d.Id2 = 35;
            int i = d.Id2;
            form2.Show();
        }
    }
}


Vielen dank für Eure Mühe und Tipps im voraus.

Gruß Thomas
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Mi 14.04.10 08:43 
Hallo,

du weißt dem DataConnection-Object "d" in Form1 beim Klick zwar die 35 zu. Frägst aber bei Form2 in der Load Methode den Member von dessen DataConnection-Objcet Instanz von Form2 zu und deshalb hat diese den Initialwert von DataConnection (0).

Der "andere" Weg, also das du auf Form2 Button klickst und in Form1 der Wert angezeigt hat funktioniert ja --> Weil du da die Referenz von Form1 übergibst und auch verwendest. Bei der DateConnection hast du jeweils eine eigne, separate Instanz.

Allgemein kannst du das ganze reduzieren:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
class Dataconnection: IAustausch
{
   public int Id1 { get; set; }
   public int Id2 { get set; }
}

public interface IAustausch
{
   int Id1 { get; set; }
   int Id2 { get; set; }
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
public partial class Form1 : Form
{
   public Form1()
   {
      InitializeComponent();
   }

    Dataconnection d = new Dataconnection();
        
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2(d);
        d.Id2 = 35;
        form2.Show();
    }
}


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
   public Form2(DataConnection dc)
   {
      InitializeComponent();
      d = dc;
   }

   Dataconnection d = null;

   private void button1_Click(object sender, EventArgs e)
   {
      d.Id1 = 22;
   }


Um die Daten in deinen Forms anzuzeigen verwendet man DataBinding. Hierfür findest du viele Beispiele im Web. Du solltest niemals auf ein form referenzieren um Daten auszutauschen (
ausblenden C#-Quelltext
1:
2:
3:
4:
        private void button1_Click(object sender, EventArgs e)
        {
            this.form1.Id = 22;
        }
). Damit hast du später nur Probleme, deshalb trennt man immer die Daten und die Ansicht.

Gruß
Thommy0606 Threadstarter
Hält's aus hier
Beiträge: 15

Win XP
C# (VS2008 Express)
BeitragVerfasst: Mi 14.04.10 10:05 
Hallo Daniel

Danke für deine schnelle Antwort und die vielen Tips. Das mit der Initialisierung in Form 2 habe ich doch glatt übersehen. Wußte leider nich wie ich eine Instanz übergebe um die Variable auch zu nutzen. Das mit der Referenzvariable von Form 2 nach Form 1 war aus einem Tutorial von tutorials.de und ebenfals als Test gedacht. Du hast aber Recht, das man das so nicht machen sollte. Im Tutorial stand das dies Beispiel nicht OOP konform ist und nur prizipiell zeigen soll wie Objektreferenzen gesetzt werden und Properties erstellt werden. Aus diesem Grund mache ich auch immer erst Test- und Übungsprojekte ehe das ganze ins Hauptprojekt einfliesst.

Also nochmals vielen Dank. Ich such mir jetzt Beiträge zu DataBinding (erst meine Bücher, dann Netz!

Gruß