none
Event weiterleiten RRS feed

  • 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

    Donnerstag, 30. Juli 2015 11:44

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
    Donnerstag, 30. Juli 2015 14:57

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
    Donnerstag, 30. Juli 2015 11:56
  • 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

    Donnerstag, 30. Juli 2015 12:06
  • 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

    Donnerstag, 30. Juli 2015 12:25
  • Danke Peter,

    das hab ich verstanden. Aber wie kann ich in Form2 einen Abonnenten registrieren, ohne dort eine Instanz von Form1 zu erzeugen?

    VG Frank

    Donnerstag, 30. Juli 2015 12:44
  • Hallo,

    @Peter Fleischer:

    Ja, Du hast recht.  Danke für den Hinweis.


    @Frank:

    Sind die Methoden FormLoad in deinem Code die Load-Event-Methoden?

    Grüße


    Donnerstag, 30. Juli 2015 13:57
  • 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;
    }

    Donnerstag, 30. Juli 2015 14:30
  • 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
    Donnerstag, 30. Juli 2015 14:57
  • 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

    Donnerstag, 30. Juli 2015 16:52
  • Hallo Peter,

    jetzt ist der Groschen gefallen.

    Vielen Dank!

    Grüße

    Donnerstag, 30. Juli 2015 17:16