"getter" und "setter"

K

Kanonenfutter

Ich habe eine Frage zu get und set:
Wenn man zb eine variable von einer form in der anderen einlesen will, verwendet man üblicherweise get und set. Die 2. form nimmt aber nur den wert an, der beim erstellen der variable zugewiesen wurde, damit meine ich zb.:
( in form1)
Code:
private string test="test";
public string Test
{
	get
	{
		return test;
	}
	set
	{
		test=value;
	}
}
(in form2)
Code:
private void button1_Click(object sender, System.EventArgs e)
{
	Form1 string_einlesen = new Form1();
	textBox1.Text=string_einlesen.Test;
}
--> ausgabe in der 2. form ist "test"

Wenn ich diese variable aber später beispielsweise per textbox verändere, wird der neue wert in der 2. form beim erneuten aufruf von string_eilesen.Test nicht mehr übernommen. Was mache ich hierbei falsch?
 
Zuletzt bearbeitet von einem Moderator:
Hallo.

1) Bitte benutz die Code-Tags!
2) So wie es aussieht erstellst du immer wieder eine neue Instanz von string_einlesen, und da ist klar das die Variable nicht den Wert hat, den du einer anderen Instanz zugewiesen hast.

Oder kommt mir nur das so vor? Zeig mir aber evt. etwas mehr von deinem Code, damit man den Ablauf besser erkennen kannst.

Mfg,
Alex
 
sry wegen den Code-Tags, wusste nicht wie man sie verwendet
Das ist im eigentlichen der gesamte code von diesem test-programm:
Form1:
Code:
//windows generierter code

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace WindowsApplication2
{
	/// <summary>
	/// Zusammenfassung für Form1.
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.TextBox textBox1;
		private System.Windows.Forms.Button button1;
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public Form1()
		{
			//
			// Erforderlich für die Windows Form-Designerunterstützung
			//
			InitializeComponent();

			//
			// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
			//
		}

		/// <summary>
		/// Die verwendeten Ressourcen bereinigen.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}
[STAThread]

		static void Main() 
		{
			Application.Run(new Form1());
		}



		public string textbox
		{
			get
			{
				return text;
			}
			set
			{
				text=value;
			}
		}

		private void button1_Click(object sender, System.EventArgs e)
		{
			text=textBox1.Text;	//hier habe ich versucht den text zu ändern
			System.Windows.Forms.Form form2=new Form2();
			form2.Show();
		}
	}
}

Form2:
Code:
//von Windows generierter code
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsApplication2
{
	/// <summary>
	/// Zusammenfassung für Form2.
	/// </summary>
	public class Form2 : System.Windows.Forms.Form
	{
		private System.Windows.Forms.TextBox textBox1;
		private System.Windows.Forms.Button button1;
		/// <summary>
		/// Erforderliche Designervariable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public Form2()
		{
			//
			// Erforderlich für die Windows Form-Designerunterstützung
			//
			InitializeComponent();

			//
			// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu
			//
		}

		/// <summary>
		/// Die verwendeten Ressourcen bereinigen.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if(components != null)
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}



private void button1_Click(object sender, System.EventArgs e)
		{
			Form1 form1=new Form1();
			textBox1.Text=form1.textbox;
		}
Wie gesagt, es ist nur ein Testprogramm
Im generellen will ich nur, dass in der 2. form per button klick der text von der textbox1 aus form1 in die textbox1 aus form2 übertragen wird.
 
Gut, hauptsache du weisst nun wie es geht. :)
Unwichtige Zeilen kannst aber ruhig rauslöschen, meinte nur den wichtigen Code, aber passt schon jetzt.

Code:
private void button1_Click(object sender, System.EventArgs e)
{
	text=textBox1.Text;	//hier habe ich versucht den text zu ändern

//	System.Windows.Forms.Form form2=new Form2();
	Form2 form2=new Form2(); // Besser!

	form2.Show();
}

Du willst ja aus der bereits geöffneten Form1 den Text holen, wenn ich mich nicht verlesen habe.
Dann solltest du nicht noch ein Form öffnen.

Code:
private void button1_Click(object sender, System.EventArgs e)
{
	Form1 form1=new Form1(); // Hier öffnest ja eine neue Form..
	textBox1.Text=form1.textbox;
}

Also:
Code:
in Form1.cs
private void button1_Click(object sender, System.EventArgs e)
{
	text=textBox1.Text;	//hier habe ich versucht den text zu ändern
	Form2 form2=new Form2(this);
	form2.Show();
}

Form2.cs
...
private Form1 _parent;
...
public Form2(Form1 parent)
{
	this._parent = parent;
}
...
private void button1_Click(object sender, System.EventArgs e)
{
	textBox1.Text=_parent.textbox;
}


Also, was habe ich jetzt gemacht?
Form2 habe ich eine Variable spendiert welche eine Referenz auf Form1 speichert. Die Instanz von Form1 wird beim Konstruktor übergeben.
Wenn nun in Form2 der Button geklickt wird, wird der Text über die Variable _parent gesetzt, der Text im zuerst geöffneten Fenster (Form1) sollte sich also ändern.

Verstanden, und gehts?

Mfg,
Alex
 
Eine nicht behandelte Ausnahme des Typs 'System.NullReferenceException' ist in WindowsApplication2.exe aufgetreten.

Zusätzliche Informationen: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

so die zurückgegebene Fehlermeldung

und markiert wird folgende zeile:
Code:
textBox1.Text=_parent.textbox;
 
Hallo.

Wie es aussieht hast du entweder ein Problem mit der Textbox, oder mit dem Verweis auf das andere Form.
Hast du den Konstruktor so erstellt wie ich, bzw. ist in Form1 alles in Ordnung mit der Eigenschaft "textbox"?

Vielleicht zeigst nochmal deinen Code der 2 Formulare.

// Alex
 
Wo genau sollte ich den code von dir einfügen? ich hab noch nichts mit Konstruktoren gemacht, weil wir in der Schule echt langsam vorankommen.
 
Hm, gut. Dann ein bisschen Grundlagen.

Ein Konstruktor ist eine Methode die den selben Namen trägt wie die Klasse zu der er gehört, jedoch keinen Rückgabewert besitzt. Also nur Zugrifssmodofizierer und Name.
In deinem Fall z.B.:
Code:
public Form1()
{
}
Und wozu er gut ist? Der Konstruktor wird immer dann aufgerufen wenn eine neue Instanz einer Klasse erstellet wird.

Jetzt dann noch eine kleine Anleitung was ich meinte das du tun solltest.

In Form2 ersetzt du folgende Sachen:
Code:
public Form1()
{
	//
	// Erforderlich für die Windows Form-Designerunterstützung
	//
	InitializeComponent();

	//
	// TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von  InitializeComponent hinzu
	//
}

Das (den Konstruktor) ersetzt du durch.

Code:
private Form1 _parent;

public Form2(Form1 parent)
{
	this._parent = parent;
}

Und

Code:
private void button1_Click(object sender, System.EventArgs e)
{
	Form1 form1=new Form1();
	textBox1.Text=form1.textbox;
}

Durch

Code:
private void button1_Click(object sender, System.EventArgs e)
{
	textBox1.Text=_parent.textbox;
}

In Form1 ersetzt du nun dies:
Code:
private void button1_Click(object sender, System.EventArgs e)
{
	text=textBox1.Text;	//hier habe ich versucht den text zu ändern
	System.Windows.Forms.Form form2=new Form2();
	form2.Show();
}

Durch:

Code:
private void button1_Click(object sender, System.EventArgs e)
{
	text=textBox1.Text;	//hier habe ich versucht den text zu ändern
	Form2 form2=new Form2(this); 
	form2.Show();
}

Ausserdem, ich finde irgendwie die Variable 'text' nicht bei deinem Form1.
Solltest du es vergessen haben, schreibe das noch ausserhalb einer Methode dazu.
Code:
private string text = "";

Übrigens, ein paar Sachen über Konstruktor und Co solltest schon wissen. Macht euer Professor nicht zuerst ein wenig Theorie? Gleich mit GUI Anwendungen zu beginnen ist nicht unbedingt gut finde ich.

Wenn dich C# interessiert, und du selbst ein wenig lernen willst, unter http://www.galileocomputing.de/openbook/csharp/ findest du ein Buch zum Lesen, umsonst.
Kannst ein wenig reinschnuppern.

Mfg,
Alex
 
Sry, dass ich so lange nicht geantwortet habe, ich hatte irgendwie keine Berechtigung zum Antworten, aber egal.
Ich habe mit meinem Professor darüber geredet, und er meinte, dass ich die Variablen als static internal definieren sollte, und die 2. Form den Namespace der 1. benutzen sollte. So hats bei mir funktioniert.
Ich konnte dann in der 2. Form die Variablen folgendermaßen verwenden:
Code:
<Namespace>.Form1.<Variable>
 
Zuletzt bearbeitet:
Seit wann wissen Professoren von was sie reden? *fg* Ich hatte mal einen, der mir glauben machen wollte, dass man mit 8 Bit die Zahlen von 0 bis 256 darstellen kann, also 257 mögliche Kombinationen. *lol* Sind aber bloß 256 Kombinationen. ;)
Egal ...

Ich hab den Threat hier zwar bloß überflogen, aber ich verstehe nicht wieso Du es nicht so machst wie es Dir Alexander Schuc vorgeschlagen hat? Sieht doch gut aus. :)

Ich habs zwar noch nie mit internal static versucht, aber ich glaube irgendwie nicht, dass Dir das weiterhelfen kann bei Deinem Problem. Datenaustausch zwischen zwei Forms mache ich entweder über Getter/Setter oder noch "sauberer" über Konstruktoren wie Alexander Schuc es auch erklärt hat.
 

Neue Beiträge

Zurück