Benutzer mit den meisten Antworten
Event weiterleiten

Frage
-
Hallo Zusammen,
ich möchte ein Event von der einer Basisklasse über Form 1 an Form 2 weiterleiten.
Ich habe also in der Basisform das Event erstellt .
Basisklasse
delegate void TextEingang(String s); public TextEingang texteingangEvent; ..... .... If(texteingangEvent != null) texteingangsEvent(text);
Form1
delegate void weiterleitenform2(); public event weiterleitenform2 weiterleitenform2Event; FormLoad { Basisklasse basisklasse = new Basisklasse(); basisKlasse.texteingangEvent += Weiterleiten; } pulic void Weiterleiten(String Text) // Eventmethode wird ausgelöst { if(weitenleitenform2Event != null) // abfrage ergibt null Event wird nicht augelöst weiterleitenform2Event(Text); }
Form2
FormLoad { Form1 form1 = new Form1(); form1.weiterleitenform2Event += TextAnzeigen; } public void TextAnzeigen(String Text) { texBox1.Text = Text; }
Die ist eine reine Verständnisfrage. Warum kommt das Event nicht in Form2 an?
danke
Antworten
-
Hi,
wenn Du die Instanz von Form1 nutzen willst, um das in Form1 deklarierte Ereignis zu abonnieren, dann brauchst Du einen Verweis auf das Form1-Objekt. Diesen Verweis kannst Du beim Instanziieren von Form2 übergeben (im Konstruktor oder in einer dafür geschaffenen Methode) oder auch über ein statisches Objekt ablegen, auf das dann Form2 zugreift. Die Lösung mit dem statischen Objekt empfinde ich als die bessere Variante.--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Frank_71 Donnerstag, 30. Juli 2015 17:16
Alle Antworten
-
Hallo Frank,
die Objekten form1 und basisklasse werden in der Methoden FormLoad erstellt. Diese Methoden sollen aufgerufen werden, bevor das erste Event verschickt wird.
Besser wäre die Objekte als Variablen einer Klasse zu deklarieren und im Konstruktor zu implenentieren:
public partial class Form1 { private Basisklsse basisklasse; public Form1() { basisklasse = new Basisklasse(); basisklasse.textEingagnEvent +=Weiterleiten; } ... ... } public partial class Form2 { private Form1 form1; public Form1() { form1 = new Form1(); form1.weiterleitenForm2Event+= TextAnzeigen; } ... ... }
Grüße- Bearbeitet Iso7 Donnerstag, 30. Juli 2015 13:49 Falsche Aussage, Hinwies von Peter Fleischer
-
Hi Frank,
hier scheinst Du einen Denkfehler zu haben. In Form2 erzeugst Du eine neue Instanz vom Typ Form1. Diese Instanz wird aber in Deinem Codeausschnitt nicht angezeigt. Beim Erzeugen der Instanz von Form1 erzeugst Du eine neue Instanz von Basisklasse. Dort wird das Ereignis ausgelöst. Wenn das Ereignis im Konstruktor ausgelöst werden soll, gibt es noch keinen Abonnenten, da die Zuweisung erst nach der Instanziierung durchgeführt wird. Damit kommt auch nichts in Form2 an.--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks -
Hi Is007,
Deine Aussage ist falsch. Auch wenn Verweisvariablen innerhalb einer Methode nur gültig sind (das bezeichnest Du vermutlich mit lokale Objekte), bleiben die Objekte, die dieser Verweisvariablen zugewiesen wurden, solange bestehen, solange es weitere Verweise gibt. Mit dem "+=" wurden solche weiteren Verweise angelegt. Damit ist die Lebensdauer der Objekte nicht auf die Lebensdauer einer Verweisvariablen beschränkt.--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks -
Hallo Iso,
Nein, FormLoad ist das standard Form2 Ereignis. Dort sollte die Eventregistrierung stattfinden.
Grüße
FormLoad { Form1 form1 = new Form1(); form1.weiterleitenform2Event += TextAnzeigen; } public void TextAnzeigen(String Text) { texBox1.Text = Text; }
-
Hi,
wenn Du die Instanz von Form1 nutzen willst, um das in Form1 deklarierte Ereignis zu abonnieren, dann brauchst Du einen Verweis auf das Form1-Objekt. Diesen Verweis kannst Du beim Instanziieren von Form2 übergeben (im Konstruktor oder in einer dafür geschaffenen Methode) oder auch über ein statisches Objekt ablegen, auf das dann Form2 zugreift. Die Lösung mit dem statischen Objekt empfinde ich als die bessere Variante.--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks- Als Antwort markiert Frank_71 Donnerstag, 30. Juli 2015 17:16
-
Hallo Frank,
ich habe ein kleines Beispiel gebastelt, wo Event von Basisklasse über Form1 zu Form2 weitergeleitet wird.
Basisklasse als Form:
public partial class BasisForm : Form { public event EventHandler<BaseDataChanged> EventBaseDataChanged; private Form1 form1; private Form2 form2; public BasisForm() { InitializeComponent(); form1 = new Form1(this); form2 = new Form2(form1); //form1.Visible = true; form2.Visible = true; } private void button1_Click(object sender, EventArgs e) { if(EventBaseDataChanged!=null) EventBaseDataChanged(this, new BaseDataChanged(textBox1.Text)); } } public class BaseDataChanged : EventArgs { private string message; public BaseDataChanged(string inMessage) { message = inMessage; } public string Message { get { return message; } } }
Form1:
public partial class Form1 : Form { public event EventHandler<BaseDataChanged> EventForm1BaseDataChanged; public Form1(BasisForm formBasis ) { InitializeComponent(); formBasis.EventBaseDataChanged += new EventHandler<BaseDataChanged>(formBasis_EventBaseDataChanged); } void formBasis_EventBaseDataChanged(object sender, BaseDataChanged e) { if(EventForm1BaseDataChanged!=null) EventForm1BaseDataChanged(this, new BaseDataChanged(e.Message)); } }
Form2:
public partial class Form2 : Form { public Form2(Form1 form1) { InitializeComponent(); form1.EventForm1BaseDataChanged += new EventHandler<BaseDataChanged>(form1_EventForm1BaseDataChanged); } void form1_EventForm1BaseDataChanged(object sender, BaseDataChanged e) { label1.Text = e.Message; } }
Grüße