Laden...

Wohin mit welchen Teilen eines Events, das über 2 Klassen gereicht wird?

Erstellt von Gerri3d vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.108 Views
G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren
Wohin mit welchen Teilen eines Events, das über 2 Klassen gereicht wird?

Hallo, ich habe eine Grundlegende Frage zu Events.

Es gibt 2 Klassen, eine zur Berechnung von Werten, die andere ist die standard Windows Forms Klasse "Form1".

Nun möchte ich eine MsgBox aufrufen wenn ein Fehler erkannt wird in der Berechnungsklasse,
klassiches 3 Schichten Software Architecture eben.

Nun zu meiner Frage - wo werden welche Teile des Ereignisses geschrieben?

  1. Delegate / delegate
  2. Instanz / event
  3. Auslösen
  4. Ereignisbehandlung
  5. Eventhandler anmelden.

1,2,3 in der Berechnugsklasse
4,5 in der Formsklasse?

Es wird eine Instanz der Berechnugsklasse in der Formsklasse erzeugt (ich hoffe dass das soweit verständlich ist)

Gruß Gerri3d

16.830 Beiträge seit 2008
vor 6 Jahren

Das ergibt sich ja allein am Flow.

Events werden durch die Logik ausgelöst.
Eine UI lauscht auf diese Events und reagiert darauf.

Wo die Instanz selbst liegt kann man so nicht sagen; das kommt ja auf die Anwendung an.
Das kann in einem UI Fenster sein - kann aber auch im Gesamtkontext der Anwendung sein. Je nachdem.

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren

vielen Dank, hat geklappt.

Da das PopUp (Ereignisbehandlung) mit jedem anmelden des Events (buttonClick) um einmal mehr ausgeführt wird, sollte man ja das Event wieder abmelden.

Gibt es hier ein Standardprozedere?

Ich habe das Event im Augenblick als letzte Anweisung der buttonClick Methode der Form Klasse ausgeführt und es klappt zumindest.

1.040 Beiträge seit 2007
vor 6 Jahren

Zeige mal bitte den Code, vermutlich wird der EventHandler zu oft angemeldet.

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren

Zeige mal bitte den Code, vermutlich wird der EventHandler zu oft angemeldet.

Calculation.cs


        public delegate void MessageOfEventDelegate(object sender, string e);
        public event MessageOfEventDelegate MessageOfEventDelegateInstance1;

        private void MsgBoxEventTrigger(string msg, string capture)
        {
            MessageOfEventDelegateInstance1?.Invoke(this, msg); // gibt null zurück wenn Delegate keine Wert aufweißt - Mind. ein Event-Handler muß angemeldet sein
        }

In Forms1.cs


 private void messageOfEventHandling(object o, string s)
        {
            string caption = "Fehler";
            MessageBoxButtons button = MessageBoxButtons.OK;
            DialogResult result = MessageBox.Show(s, caption, button);
            if (result == DialogResult.OK)
            {
                return;
            }
        }

        private void buttonGeneriere_Click(object sender, EventArgs e)
        {
            // calculate
            calculation = new Calculation(inputData.excelName, inputData.csvCodierungName, inputData.csvKloepperbodenName,
                                            inputData.csvFlanschName, inputData.dxfName, inputData.iniName, inputData.Torch,
                                            inputData.flexIsoMuffe, inputData.flexIsoNippel, inputData.flexIsoFlansch, excelSel);
            
            // Event-Handler anmelden
            calculation.MessageOfEventDelegateInstance1 += new Calculation.MessageOfEventDelegate(messageOfEventHandling);

            // Berechne / Generiere mit allen Circles
            ColCheckAndExportIniData(false);

            // new object - all modifications lost
            buttonReGenerate.Visible = false;

            // Event-Handler abmelden
            calculation.MessageOfEventDelegateInstance1 -= new Calculation.MessageOfEventDelegate(messageOfEventHandling);
        }

        private void buttonReGenerate_Click(object sender, EventArgs e)
        {
            if (calculation == null)
            {
                return;
            }

            // Event-Handler anmelden
            calculation.MessageOfEventDelegateInstance1 += new Calculation.MessageOfEventDelegate(messageOfEventHandling);
            

            // Berechne / Generiere alle nicht abgewählten Circles
            ColCheckAndExportIniData(true);

            // Event-Handler abmelden
            calculation.MessageOfEventDelegateInstance1 -= new Calculation.MessageOfEventDelegate(messageOfEventHandling);
        }

16.830 Beiträge seit 2008
vor 6 Jahren

Du registrierst und de-registrierst doch zwei völlig unterschiedliche Referenzen.
Du hast hier jedes mal ein "new".

Korrekt wäre zB:

EventHandler myHandler = (s, e) => MessageBox.Show("Yipiiiee");

anyThing.Event += myHandler;
...
anyThing.Event  -= myHandler;

In Deinem Fall sollte auch folgendes Klappen:

calculation.MessageOfEventDelegateInstance1 += messageOfEventHandling;

// Berechne / Generiere alle nicht abgewählten Circles
ColCheckAndExportIniData(true);

// Event-Handler abmelden
calculation.MessageOfEventDelegateInstance1 -= messageOfEventHandling;

PS: eine Klasse nur "Calculation" zu nennen ist auch etwas Käse.
Man soll am Namen einer Klasse erkennen, was sie tut. Das ist hier nicht der Fall.

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren

löschen

D
985 Beiträge seit 2014
vor 6 Jahren

Es scheint ja so, als ob dieses Event nur denjenigen interessiert, der die Methode aufruft.

In dem Fall ist es sinnvoller der Methode einen Callback mitzugeben und den Event zu entsorgen.

G
Gerri3d Themenstarter:in
57 Beiträge seit 2017
vor 6 Jahren

Vielen Dank.
Tatsächlich wird nur eine Berechnung durchgeführt in diesem Programm von daher hatte ich mir nie Gedanken über die Sinnhaftigkeit gemacht.

Was mich mehr verwundert ist, warum der Syntax so im Buch

Visiual C# - Grundlagen und Profiwissen, 2010. Hanserverlag auf Seite 181 beschrieben wird.

D
985 Beiträge seit 2014
vor 6 Jahren

Manchmal hat der Autor das selber nicht begriffen oder einfach einen Bug in dem Buch oder du hast es nicht genau durchgelesen und verstanden.

Such dir eine der Möglichkeiten aus.

5.658 Beiträge seit 2006
vor 6 Jahren

Syntax und Sinnhaftigkeit sind aber zwei völlig unterschiedliche Konzepte. Wenn etwas nicht sinnvoll ist, dann hilft dabei auch kein korrekter Syntax.

Weeks of programming can save you hours of planning