Zum Inhalt springen

C# Eigene Events und EventHandler


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben (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 von lilith2k3
Geschrieben

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

Geschrieben

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

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...