Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Event und Übergabeparameter
benji
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Frankenland

Themenstarter:

Event und Übergabeparameter

beantworten | zitieren | melden

Guten Morgen zusammen!

Ich habe jetzt schon sämtliche Beiträge zum erstellen von eigenen Events durchgelesen aber ich werde irgendwie nicht schlau daraus bzw. war irgendwie nicht das richtige dabei.
Es geht um folgendes:

Ich habe einen Wlan-Handscanner der in einem Netzwerk arbeitet. Nun überwache ich den Rückgabewert eines Pings auf einen Server. Sobald sich dieser ändert, soll das Event ausgelöst werden.

Meine Frage, wie bekomme ich diesen Wert in den Event übergeben?


Ich habe als Grundgerüst diesen Code genommen: [Lösung] Problem mit EventHandler


Vielen Dank für Eure Hilfe im Voraus! Vielleicht steh ich auch einfach nur auf der Leitung :-(
private Nachricht | Beiträge des Benutzers
davidG
myCSharp.de - Member



Dabei seit:
Beiträge: 67

beantworten | zitieren | melden

Habe ich es richtig verstanden, dass du den Rückgabewert per Event weitergeben willst? Ich sehe da zwei Lösungsmöglichkeiten (Für weitere bin ich offen). Ich weiß allerdings nicht, welche die Bessere ist. Vll kann dazu jmd was sagen.

Also 1: Den Rückgabewert in eine Propertie speicher, dass Event auslösen und die Klasse die das Event abonniert hat, liest die Properite aus:


public class HandScanner
{
  private object _rueckgabe;

  public object Rueckgabe
  {
    get { return _rueckgabe;}
  }
 
  private void UeberwacheHandScanner()
  {
    if(_rueckgabe != rueckgabeNeuerPing)
    {
      _rueckgabe = rueckgabeNeuerPing;
      OnChangeEvent();
    }
  }

  public delegate void EventDelegate(object source, EventArgs e);

  public event  EventDelegate ChangeEvent;

  private void OnChangeEvent()
  {
    if(ChangeEvent != null)
    {
      ChangeEvent(this, new EventArgs());
    }
  }
}

public class VerarbeiteRueckgabe
{
  public VerarbeiteRueckgabe()
  {
    _handScanner = new HandScanner;
    _handScanner.ChangeEvent += EventDelegate(_handScanner_ChangeEvent);
  }
  private HandScanner _handScanner;
  
  private void _handScanner_ChangeEvent(object value, EventArgs e)
  {
      object rueckgabe = _handScanner.Rueckgabe;
  }
}

oder 2. den Übergabewert mit ins Event verpacken:


public class HandScanner
{
  private void UeberwacheHandScanner()
  {
    if(rueckgabeAlterPing != rueckgabeNeuerPing)
    {
       OnChangeEvent(rueckgabeNeuerPing);
    } 
  }

  public delegate void EventDelegate(object value, EventArgs e);

  public event  EventDelegate ChangeEvent;

  private void OnChangeEvent(object rueckgabe)
  {
    if(ChangeEvent != null)
    {
      ChangeEvent(rueckgabe, new EventArgs ());
    }
  }
}

public class VerarbeiteRueckgabe
{
  public VerarbeiteRueckgabe()
  {
    _handScanner = new HandScanner;
    _handScanner.ChangeEvent += EventDelegate(_handScanner_ChangeEvent);
  }
  private HandScanner _handScanner;
  
  private void _handScanner_ChangeEvent(object value, EventArgs e)
  {
      object rueckgabe = value;
  }
}

Ich habe den Code nicht getestet. Nur kurz runtergeschrieben. Wie gesagt, so würde ich es lösen, weiß allerdings nicht, welche der Beiden Methoden besser ist.
„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

beantworten | zitieren | melden

Golo Roden hat auf seiner "Guide to c#"-Seite einen Interessanten Artikel: Events
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

Hallo benji,

Du definierst in dem Beispielcode von Herbivore einen Delegaten mit dem Namen "MyHandler". Dieser Delegat definiert wie die aufzurufende Methode auszusehen hat (Methodenrumpf).

In Herbivore's Fall sind das 2 Strings. Du kannst hier aber definieren was Du möchtest. Wenn Du z.B. einen Bool-Wert übertragen willst (Ping war erfolgreich), dann definierst Du das folgendermaßen:


public delegate void MyHandler (bool p_PingSuccesfull);

Entsprechend muss dann natürlich die Event-Behandlungsmethode und auch die "OnXXX"-Methode angepasst werden.

Der Parameter wird dann über die "OnXXX"-Methode an folgender Stelle übergeben:


   protected virtual void OnMyEvent (bool p_PingErfolgreich)
   {
      MyHandler myEvent = MyEvent;
      if (myEvent != null) {
         myEvent (p_PingErfolgreich); // hier werden alle Behandlungs-Methode aufgerufen
      }
   }


Hoffe, dass Parameter für eigene Events nun klarer geworden sind?

Grüße
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

hallo davidG,

in variante 1 ist beschrieben, wie amn es generell nicht machen sollte. hierfür sind evantargs (wie der name schon sagt) gut.

in variante 2 machst du es fast richtig aber:

1. erster parameter sollte immer der sender sein, damit man immer weiß wer das event schmeißt
2. die informatione gehört immer in die eventargs


hallo benji,

im prinzip kannst du ein event erstellen, das den sender (also aktuelle instanz der auslösenden klasse) und die von dir erstellten eventargs mitgibt. eventuell musst du von eventargs erben und noch ein zusätzliches feld/propertie definieren.

wie man es richtig macht ist auf golos styleguide beschrieben:
http://www.guidetocsharp.de/CodingStyleEvents.aspx
davidG
myCSharp.de - Member



Dabei seit:
Beiträge: 67

beantworten | zitieren | melden

danke für die hinweise
„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay
private Nachricht | Beiträge des Benutzers
benji
myCSharp.de - Member



Dabei seit:
Beiträge: 6
Herkunft: Frankenland

Themenstarter:

beantworten | zitieren | melden

Wow danke für die superschnellen Antworten!

Ich werde gleich mal alles ausprobieren...
private Nachricht | Beiträge des Benutzers