W00K1 Geschrieben 1. Dezember 2010 Geschrieben 1. Dezember 2010 Moin Moin, ich habe folgendes Problem. Ich habe ein Main-Formular, welches sich mit einem SQL Server verbinden soll. Außerdem habe ich ncoh ein 2. Formular, wo ich eine Historie aller vorher mal gewählten Verbindungen zum auswählen habe. Mein Problem ist nun, wie ich nach Auswahl eines Objektes mit Verbindungsdaten im 2. Formular diese Info in das Main Formular zurück bekomme. Ich habe natürlich schon selbst recherchiert und bin darauf gestoßen, das Events und EventHandler der richtige Weg wären. Davon habe ich allerdings gar keine Ahnung. Könnte mir jemand ein Code-Snippet posten mit einer kleiner Erklärung dazu, wie man eigene Events schreibt und diese nutzt? mfg W00K1 Zitieren
.NETter Geschrieben 1. Dezember 2010 Geschrieben 1. Dezember 2010 Welche Sprache denn? VB .Net, C# ? Zitieren
W00K1 Geschrieben 1. Dezember 2010 Autor Geschrieben 1. Dezember 2010 Hallo, C# (steht aber auch im Tag so wie hier im Forum gefordert ;-) ) mfg W00K1 Zitieren
.NETter Geschrieben 1. Dezember 2010 Geschrieben 1. Dezember 2010 Hallo, ja wer lesen kann ist klar im Vorteil :-) Was Du vorhast ist garnicht so kompliziert. Da ich nicht weiß wie Dein Wissenstand in C# ist mache ich es mal grundlegend. Du hast Form1 welche Form2 als Dialog aufruft. Form2 soll als Beispiel nur einen String an Form1 zurück geben. Bsp. Textboxeingabe. Fangen wir im Dialog an (also Form2): Du benötigst hier einen Delegaten (Ein Delegat kann ein Methode "wrappen" welche auf einem anderen Objekt aufgerufen wird. Vielleicht mal irgendwo nachlesen...). Der Delegat besitzt eine Signatur welche festlegt was übergeben werden muss. In diesem Fall ein simpler String. Also erstellen wir einen Delegaten mit dieser Syntax in Form2: //Delegat public delegate void del_GibTextZurueck(string ausgabe); Als zweiten Schritt müssen wir das neue Event erstellen und zwar vom Typ des oben stehenden Delegaten: public event del_GibTextZurueck GibTextZurueck; Wenn Du auf der Form2 eben eine Textbox und einen Button hast könnte das Event für den Button_Click so aussehen: //Event für den Buuton_Click private void cmdEingabe_Click(object sender, EventArgs e) { if (txtEingabe.Text != "") //nur wenn Textbox nicht leer ist { GibTextZurueck(txtEingabe.Text); //hier rufst Du Dein erstelltes Event auf //Form2 wird als Dialog aufgerufen, daher Result = OK this.DialogResult = DialogResult.OK; } } Das wars schon im Dialog! Jetzt zu Form1: Du instanzierst ein Objekt vom Typ Form2 und fügst der Methode "GibTextZurueck" einen Eventhandler hinzu und zeigst Form2 als Dialog an: Form2 frm = new Form2(); frm.GibTextZurueck += new Form2.del_GibTextZurueck(frm_GibTextZurueck); frm.ShowDialog(); Den Code des Eventhandler kannst Du dann Deinen wünschen nach gestalten. Als Beispiel nehme ich den String entgegen und schreibe ihn in eine Textbox auf Form1. void frm_GibTextZurueck(string ausgabe) { txtStringAusForm2.Text = ausgabe; } Hoffe das hilft Dir weiter. Viele Grüße, Thomas Zitieren
W00K1 Geschrieben 1. Dezember 2010 Autor Geschrieben 1. Dezember 2010 Ja vielen Dank hilft mir sehr weiter. Was die Vorkenntnisse in C# angeht. Bin in der Ausbildung zum FI und ich wurde mit dem Projekt so ein bisschen ins kalte Wasser geschubst was diese Sprache angeht Funktioniert das genauso, wenn ich ein ganzes Objekt zurückbekommen möchte? Wie übergebe ich das am besten? Ich habe eine Liste von Objekten und möchte halt 1 Objekt mit all seinen Daten in Form1 bekommen mfg W00K1 Zitieren
lilith2k3 Geschrieben 1. Dezember 2010 Geschrieben 1. Dezember 2010 (bearbeitet) Wie schon erwähnt, handelt es sich bei einem delegate um soetwas wie einen Funktionszeiger unter C++, i.e. eine Verwaltungsstruktur, die Verweise auf Funktionen behandelt. public delegate Rückgabetyp DelegatName(Argumentenliste); Das heißt nichts anderes als das ein delegate mit dem Namen DelegatName existiert, welches quasi soetwas wie ein Zeiger auf eine Funktion darstellt, die als Rückgabetypen den angegebenen enthält und gleichzeitig eine Argumentenliste gleich der, welche im Delegat angegeben worden ist, entsprechen muss. (Kovarianz und Kontravarianz lasse ich einmal aussen vor; es soll ja noch verständlich bleiben *g*). Man sagt auch, dass die Signatur übereinstimmen muss. Wenn ich das Beispiel einmal aufgreife: public delegate void del_GibTextZurueck(string ausgabe); So ist an der Stelle ein delegate definiert worden, auf welches Funktionen mit dem Rückgabetyp void und dem Parameter string passen. Jedes Objekt, welches beim Auftauchen des Events benachrichtigt werden möchte, trägt sich unter public event del_GibTextZurueck GibTextZurueck; dem event ein. Das delegate gibt die Struktur vor, wie die Funktionen aussehen dürfen, die sich registrieren dürfen: Also alle Funktionen mit void und string, e.g. void frm_GibTextZurueck(string ausgabe) { txtStringAusForm2.Text = ausgabe; }[/PHP] Da Du Deine Events frei gestalten kannst, bleibt es Dir auch überlassen, welcher Art Deine Funktionen sind.Beliebt ist meist [PHP]delegate void EventHandler(object sender, EventArgs e);. Ich habe eine Liste von Objekten und möchte halt 1 Objekt mit all seinen Daten in Form1 bekommen Dann übergibt doch einfach Dein Objekt; Du musst nur den Parameter in dem delegate entsprechend abändern. Bearbeitet 1. Dezember 2010 von lilith2k3 Zitieren
W00K1 Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 Danke =) Darauf das ich das Objekt gleich als Parameter übergeben kann bin ih noch gar nicht gekomment. Und für die restlcihe Erläuterung auch nochmal vielen Dank. Ist ja wirklih nicht so schwer, aber wenn man dies in Fachbüchern liest kommt es bei mir irgenwie nie so richtig an. Dank euch beiden mfg W00K1 Zitieren
W00K1 Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 Nun habe ich ein weiteres Problem. Habe meine Quellcode nun soweit umgebaut, das ich mein Objekt mit übergebe als Parameter. public delegate void del_DBConnectClose(object sender); public event del_DBConnectClose DBConnectClose; Nun übergebe ich wenn das Formular DBConnect geschlossen wird meinen ausgewähltes Objekt, welches ich anhand des Indexes einer CheckBox erkenne DBConnectClose(Connection[cbConnections.SelectedIndex]); Soweit so gut, funktionirt auch. Wenn ich nun beim Debuggen in mein HauptFormular reinschaue und mir den sender angucken stehen dort auch die Daten drin die ich benötige. Miene Frage ist nun, wie ich an diese Datenr rankomme. Ich habe schon versucht meine "Bezeichnung" mit sender.Bezeichnung zu holen, klappt aber nicht. Wie kommen ich also an meine Daten ran? mfg W00K1 Zitieren
.NETter Geschrieben 2. Dezember 2010 Geschrieben 2. Dezember 2010 Hallo, Du legst im Delegate fest das ein "Object" übergeben wird. Du kannst hier auch ein spezifiziertes Objekt von einem beliebigen Typ (auch Objekte von eigenen Klassen) angeben. Hier mal ein Delegate: public delegate void del_GibMeinObjektZurueck(SqlConnection Connection); In der Hauptform kannst Du dann auf die Member des Objekts zugreifen wie z.B. den Connectionstring etc. Die Übergabe als "object" müsstest du erst auf das gewünschte Format Casten. Was du dir mit einer expliziten Übergabe des benötigten Objekttyps einfach sparen kannst. Sonst würde das Cast in der Hauptform so aussehen: ListViewItem item = (ListViewItem)sender; Daher würde ich gleich das Objekt übergeben was Du auch benötigst. Viele Grüße, Thomas Zitieren
W00K1 Geschrieben 2. Dezember 2010 Autor Geschrieben 2. Dezember 2010 Vielen Dank... läuft =) Danke für die einfache und dennoch verständliche erklärung =) mfg W00K1 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.