2009-05-27 10 views

Odpowiedz

24
 public class EventThrower 
     { 
      public delegate void EventHandler(object sender, EventArgs args) ; 
      public event EventHandler ThrowEvent = delegate{}; 

      public void SomethingHappened() 
      { 
       ThrowEvent(this, new EventArgs()); 
      } 
     } 

     public class EventSubscriber 
     { 
      private EventThrower _Thrower; 

      public EventSubscriber() 
      { 
       _Thrower = new EventThrower(); 
       //using lambda expression..could use method like other answers on here 
       _Thrower.ThrowEvent += (sender, args) => { DoSomething(); }; 
      } 

      private void DoSomething() 
      { 
       //Handle event..... 
      } 
     } 
+0

Dzięki za świetne rozwiązanie. Zrozumiałem to zaraz po tym, jak napisałem pytanie, a moje rozwiązanie jest bardzo podobne do twojego. – sarsnake

+0

http://stackoverflow.com/questions/8335131/winform-events-in-another-class-net2-simplify-delegate do implementacji w .NET2 –

+0

@CSgarpAtl Widzę, że została wybrana jako poprawna odpowiedź. Niestety nie mogę go uruchomić, mimo że podążałem za każdym krokiem. Próbuję uczynić mój główny formularz świadomym metody, która wydarzyła się w mojej kontroli użytkownika. – Disasterkid

6

Wewnątrz formularza:

void SubscribeToEvent(OtherClass theInstance) 
{ 
    theInstance.SomeEvent += this.MyEventHandler; 
} 

void MyEventHandler(object sender, EventArgs args) 
{ 
    // Do something on the event 
} 

Wystarczy zapisać się do wydarzenia na drugiej klasy ten sam sposób, jak do zdarzenia w formularzu. Trzy ważne rzeczy do zapamiętania:

1) Musisz upewnić się, że twoja metoda (event handler) ma odpowiednią deklarację, aby dopasować się do typu delegata wydarzenia na drugiej klasie.

2) Zdarzenie na drugiej klasie musi być widoczne dla Ciebie (np. Publiczne lub wewnętrzne).

3) Subskrybuj prawidłowe wystąpienie klasy, a nie samą klasę.

+0

@Reed_Copsey Czy Oyu dostarczyć trochę więcej kodu, jakoś mój zdarzenie nie zostanie zaakceptowany przez przewodnika – Gobliins

+0

@Gobliins nie wiem co twój problem jest - polecam prosić swoje pytanie z pełnymi szczegółami. –

+0

Jest to ten sam problem co temat, ale nvm już go rozwiązałem. – Gobliins

0

Zakładając, że zdarzenie jest obsługiwane przez EventHandler, ten kod działa:

protected void Page_Load(object sender, EventArgs e) 
{ 
    MyClass myObj = new MyClass(); 
    myObj.MyEvent += new EventHandler(this.HandleCustomEvent); 
} 

private void HandleCustomEvent(object sender, EventArgs e) 
{ 
    //handle the event 
} 

Jeśli „niestandardowe zdarzenie” wymaga innego podpisu w obsłudze, trzeba użyć tego zamiast jednego.

Powiązane problemy