2009-05-27 30 views
17

Một kịch bản đơn giản: một lớp tùy chỉnh làm tăng sự kiện. Tôi muốn tiêu thụ sự kiện này bên trong một hình thức và phản ứng với nó. Làm thế nào để làm điều đó? Ví dụ mã, xin vui lòng!Cách đăng ký các sự kiện của lớp khác trong C#?

Lưu ý rằng biểu mẫu và lớp tùy chỉnh là các lớp riêng biệt.

Trả lời

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

Cảm ơn bạn đã có giải pháp tuyệt vời. Tôi đã tìm ra nó ngay sau khi tôi đăng một câu hỏi, và giải pháp của tôi rất giống với câu hỏi của bạn. – sarsnake

+0

http://stackoverflow.com/questions/8335131/winform-events-in-another-class-net2-simplify-delegate để triển khai trong .NET2 –

+0

@CSgarpAtl Tôi thấy điều này được chọn làm câu trả lời đúng. Thật không may tôi không thể làm cho nó hoạt động ngay cả khi tôi đã theo từng bước. Tôi đang cố gắng làm cho biểu mẫu chính của tôi biết về phương thức đã xảy ra trong Điều khiển người dùng của tôi. – Disasterkid

6

Bên trong hình của bạn:

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

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

Bạn chỉ cần đăng ký sự kiện trên lớp khác giống như cách bạn sẽ đến một sự kiện trong mẫu của bạn. Ba điều quan trọng cần nhớ:

1) Bạn cần đảm bảo phương thức của bạn (trình xử lý sự kiện) có khai báo thích hợp để khớp với loại đại biểu của sự kiện trên lớp khác.

2) Sự kiện trên lớp khác cần được hiển thị cho bạn (ví dụ: công khai hoặc nội bộ).

3) Đăng ký trên một phiên bản hợp lệ của lớp, chứ không phải chính lớp đó.

+0

@Reed_Copsey oyu có thể cung cấp một số mã khác, bằng cách nào đó sự kiện của tôi sẽ không được chấp nhận bởi các handler – Gobliins

+0

@Gobliins Tôi không biết những gì vấn đề của bạn là - Tôi muốn giới thiệu hỏi câu hỏi của riêng bạn với đầy đủ chi tiết. –

+0

Vấn đề tương tự như chủ đề, nhưng nvm tôi đã giải quyết nó. – Gobliins

0

Giả sử sự kiện của bạn được xử lý bởi EventHandler, mã này hoạt động:

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 
} 

Nếu bạn "sự kiện tùy chỉnh" đòi hỏi một số chữ ký khác để xử lý, bạn sẽ cần phải sử dụng một trong những thay thế.

Các vấn đề liên quan