Laden...

[gelöst] Eigene Events mit Paramtern

Erstellt von MasterMax vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.338 Views
MasterMax Themenstarter:in
265 Beiträge seit 2006
vor 15 Jahren
[gelöst] Eigene Events mit Paramtern

Hallo!

Bis jetzt habe ich es so gelöst:


Form1 f2=new Form2();
f2.ShowDialog();
string txt=f2.txt;

in der Form2 ist hier ein public string txt in der ich den Übergabewert speichere
Nun wollte ichs mal mit Events Probieren.
Mein Ansatz:


Form2 f2=new Form2();
f2.Show();
f2.FormClosed += new FormClosedEventHandler(f2_FormClosed);


private void f2_FormClosed(string txt, List<string> log)
{
//...
}

Mein Problem ist: wie kann ich auch Parameter übergeben? Also von der Art her so:


f2.FormClosed += new FormClosedEventHandler(f2_FormClosed, new object[]{string f2.txt, log});

aber so gehts ja nicht, oder?
Jetzt habe ich mir [Lösung] Problem mit EventHandler angeschaut... wenn das die Lösung ist die man anstreben sollte, dann will ichs auch so machen... allerdings habe ich nicht verstanden wie ist das Event jetzt registrieren muss


public event EventHandler<myeventargs> f2Closed;
        protected virtual void Onf2Closed(string txt, List<string> log)
        {
            EventHandler<myeventargs> f2Closed = this.f2Closed;
            if(f2Closed!=null)
                f2Closed(this, new myeventargs(txt,log));
        }
        public class myeventargs : System.EventArgs
        {
            public myeventargs(string txt, List<string> log)
                : base()
            { //ToDo
             }
        }
//[...] ...wenn das obige stimmt müsste hier der Hund begraben sein:
private void Dialog_öffnen()
{
Form2 f2=new Form2();
f2.Show();
myeventargs e = new myeventargs(f2.txt, log);
f2.FormClosed += //so hier weiß ich nicht weiter, wie das Event definiert werden muss und wie ich jetzt die Parameter übergebe
}

-=MasterMax=-

467 Beiträge seit 2007
vor 15 Jahren

hoffe ich schreibe keinen Müll... Man kann dem Event jetzt nur einen Handler mit einer Methode übergeben, damit diese dann immer beim Event ausgeführt wird. Dabei werden die endgültigen Parameter vom Auslöser bestimmt.

weiß net ob das guter stil ist, aber ich würde den Konstruktor von Form2 überladen.

MasterMax Themenstarter:in
265 Beiträge seit 2006
vor 15 Jahren

stimmt ich sehs jetzt auch:


f2.Show();
myeventargs e = new myeventargs(f2.txt, log);
f2.FormClosed += //so hier weiß ich nicht weiter, wie das Event definiert werden muss und wie ich jetzt die Parameter 

ist sinnlos, weil erst nachdem Form2 geschlossen wurde der Parameter f2.txt feststeht

-=MasterMax=-

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo MasterMax,

Form2 f2=new Form2();  
f2.Show();  
f2.FormClosed += new FormClosedEventHandler(f2_FormClosed);  

du solltest erst registrieren, und dann anzeigen.

wie kann ich auch Parameter übergeben?

Gar nicht. Weder beim Registrieren noch (da es nicht dein eigener Event ist) beim Feuern.

Mit deinem Ansatz mit dem eigenen Event rennst du in die falsche Richtung.

Es ist doch ganz einfach. Rufe die gewünschte Information im EventHandler ab. Als sender bekommst du dort das richtige Form übergeben und muss es nur noch auf den richtigen Typ casten, um zugreifen zu können.

herbivore

MasterMax Themenstarter:in
265 Beiträge seit 2006
vor 15 Jahren

wenn ich das richtig verstanden habe dann ist der Ansatz über das eigene Event falsch. Was ist jetzt vom Stil her besser?
Nochmal zur Verdeutlichung was ich eigentlich machen will und wie ichs bisher gemacht habe:
Form1:


Form2 f2=new Form2();
f2.ShowDialog()
string text=f2.txt;//das brauche ich

Form2:


public string txt;
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Return)
{
txt = textBox1.Text;
this.Close();
}
}

ich dachte dass es vom Stil her besser ist, wenn ich nicht starr darauf warte bis Form2 geschlossen wurde, sondern es über ein Event abfange.
Form1:


Form2 f2=new Form2();
f2.Show();
f2.FormClosed += new FormClosedEventHandler(f2_FormClosed);


void f2_FormClosed(object sender, FormClosedEventArgs e)
{
//so, aber hier kann ich nicht mehr auf f2.txt zugreifen... muss ich die Daten in der Form2 anderweitig übertragen?
}

Es ist doch ganz einfach. Rufe die gewünschte Information im EventHandler ab. Als sender bekommst du dort das richtige Form übergeben und muss es nur noch auf den richtigen Typ casten, um zugreifen zu können.

könntest du das bitte nach dem Motto "Code sagt mehr als 1000 Worte" kurz erklären?
[FAQ] Kommunikation von 2 Forms kenne ich bereits

-=MasterMax=-

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo MasterMax,

aber hier kann ich nicht mehr auf f2.txt zugreifen

doch, sender ist das Form, das auch von f2 referenziert wird. Du musst sender nur auf den Typ von f2 casten.

Form2 f2=new Form2();  
f2.Show();  
f2.FormClosed += new FormClosedEventHandler(f2_FormClosed);  

Du solltest erst registrieren, und dann anzeigen.

herbivore

MasterMax Themenstarter:in
265 Beiträge seit 2006
vor 15 Jahren

Ach jetzt ist der Groschen gefallen!

Lösung:


Form2 f2=new Form2();
f2.FormClosed += new FormClosedEventHandler(f2_FormClosed);
f2.Show();


void f2_FormClosed(object sender, FormClosedEventArgs e)
{
Form2 f2 = sender as Form2;
string txt = f2.txt;
}

Danke!

-=MasterMax=-