Wenn Variable gesetzt => Aktion

Hi!

Gleich mal vorweg: Als Lektüre kann man sicher das aktuelle OpenBook von Galileo empfehlen. :) Visual C# 2010.

Nun zum Problem:
Also den Button gleich public zu setzen, würd ich vermeiden.. Da gibts sicher interessantere Arten dies zu lösen.. ;)

Hier mal eine Variante, die man auch als Anfänger recht schnell verstehen können sollte.. :)

Das Feld in Form1 ist auf privat gesetzt, Zugriff erfolgt über eine öffentliche Eigenschaft. Im Set-Teil der Eigenschaft wird überprüft ob der neue Wert sich vom Alten unterscheidet. Wenn der neue Wert wirklich neu ist, wird dieser auf das private Feld gesetzt und eine Methode aufgerufen. Ist der neue Wert gleich, wird nichts gemacht weil sich ja nichts ändert.

In der aufgerufenen Methode kann dann jede beliebige Aktion durchgeführt werden, die wann immer sich die Variable ändert auch ausgeführt werden soll. Dabei ists ganz egal wer den Wert ändert.

In Form2 brauchts jetzt nur eine Möglichkeit die Variable in Form1 zu setzen. Dazu übergeben wir einfach einen Verweis auf Form1 im Konstruktor. Da Form2 ziemlich sicher erst nach Form1 erstellt wird, sollte das ja Problemlos möglich sein.

Nachfolgend kurz ein bischen Code wir das ungefähr aussieht. Es ist halt ein Ansatz von der anderen Seite, im Vergleich zum Vorgehen von Steiner_B. - klingt aber eher nach der richtigen Lösung zu "wie man die ganze Zeit überprüft ob eine Variable gesetzt wird. Wenn die Variable dann gesetzt wird soll dann eine Aktion stattfinden."

C#:
public class Form1 : Form
{
	private bool myVariable = false;
	
	public bool MyVariable
	{
		get { reutrn myVariable; }
		set
		{
			if (myVariable == value)
				return; // die variable würde sich nicht ändern, also keine benachrichtigung
				
			myVariable = value;
			MyVariableChanged();
		}
	}

	private void MyVariableChanged()
	{
		// hier deine Aktion ausführen..
	}

}

public class Form2 : Form
{
	private Form1 form1;
	
	public Form2(Form1 form)
	{
		this.form1 = form;
		//.. Form2 hat button1
	}
	
	private void button1_Click(object sender, EventArgs ea)
	{
		form1.MyVariable = true;
	}
}

Noch ein Hinweis: Du solltest gleich von Anfang an beginnen deinen Variablen sinnvolle Namen zu geben. "Form1", "Form2", etc. sagen ja überhaupt nichts aus. :)

Grüße,
Alex
 
Danke erstmal nochmal verstanden hab ich es auch aber wenn ich auf den knopf bei form2 drück stürztz das programm ab und diese fehlermeldung bei:
public class Form2 : Form
{
private Form1 form1;

public Form2(Form1 form)
{
this.form1 = form;
//.. Form2 hat button1
}

private void button1_Click(object sender, EventArgs ea)
{
form1.MyVariable = true;
}
}

"NullReferenceException wurde nicht behandelt.
Der Objektsverweis wurde nicht auf eine Objektinstanz festgelegt."
 
Hallo,

@Alexander Schuc: Vom Verständnis her ist deine Lösung sicher die bessere Variante, ich würde nur im Sinne der Wiederverwendbarkeit bzw. Code-Wartbarkeit davon absehen solche Lösungen zu bauen, da du jetzt auch jedes Mal den Coder der "Form2" verändern musst wenn du diese noch an einer anderen Stelle nutzen möchtest. Auch im Bezug auf Thread-Sicherheit sollte man eher Events als Setter verwenden, da (hier im Beispiel) der EventHandler im Thread der Form1 ausgeführt wird, aber der Setter im Thread von Form2 laufen würde.
Die meiner Meinung nach beste Lösung ist, wie schon im ersten Post beschrieben, sich selbst ein Event in der Form2 zu schreiben, welches dann vom button_click ausgelöst wird.
 
Hoi..

Ob Form2 wirklich einen eigenen UI Thread haben wird? Wäre mir wirklich neu, dass das als "gute Idee" durchgeht. Aber hey, ich machte ne Weile nichts mit WinForms.. ^^

Inwiefern ist denn das Event besser als der Setter, im Sinne der Threadsicherheit?
Das Event wechselt ja auch nicht gnädigerweise für jeden EventHandler der dranhängt in den "richtigen" Thread. Das muss man dann schon noch selber machen.. ;)

Den Button in Form2 öffentlich zu machen ist dann aber auch nicht wirklich ne tolle Idee.. aber Wiederverwendbarkeit/Code-Wartbarkeit ist hier in dem Thread glaub ich noch kein Thema. Natürlich sollte man so früh wie möglich nach Best-Practices arbeiten.. aber das dürfte einen Anfänger ziemlich schnell frusten..

Mein Code macht übrigens schon mal die erste Hälfte von dem was du in deinem ersten Beitrag beschrieben hast.
glaub ich sich selbst ein Event zu schreiben und dieses z.B.: im Setter der Variable aufzurufen. Die Aktion die du ausführen möchtest kannst du dann in einem EventHandler implementieren.

MyVariableChanged wäre der richtige Ort um ein Event abzufeuern. (Schickerweise sollte man die Methode dann aber z.b. OnMyVariableChanged nennen,..)


Ein schlichtes "Alex" reicht übrigens als Anrede.. :)

lg
 
Hi.

@19bluedragon99: Wie hast du denn die Instanz von Form2 erzeugt?

Du müßtest es aus Form1 heraus folgendermaßen tun:
C#:
var form2 = new Form2(this);
Du hast evtl. einen anderen Konstruktor verwendet?

Gruß
 
Hallo nochmal ich glaub ich stell jezz ne noch blödere Frage aber egal^^
ich weiß nicht so recht wo und wie ich nen richtgen verweis machen soll
 
Zurück