2010-02-22 28 views
5

Tôi đang viết một Thư viện Lớp sẽ được các ứng dụng khác sử dụng. Tôi đang viết nó trong C# .NET. Tôi gặp sự cố khi kích hoạt các sự kiện trong các lớp học. Đây là những gì tôi cần phải làm ...Làm cách nào để kích hoạt sự kiện trên các lớp học?

public class ClassLibrary 
{ 
    public event EventHandler DeviceAttached; 

    public ClassLibrary() 
    { 
     // do some stuff 
     OtherClass.Start(); 
    } 
} 

public class OtherClass : Form 
{ 
    public Start() 
    { 
     // do things here to initialize receiving messages 
    } 

    protected override void WndProc (ref message m) 
    { 
     if (....) 
     { 
      // THIS IS WHERE I WANT TO TRIGGER THE DEVICE ATTACHED EVENT IN ClassLibrary 
      // I can't seem to access the eventhandler here to trigger it. 
      // How do I do it? 

     } 
     base.WndProc(ref m); 
    } 

} 

Sau đó, trong ứng dụng được sử dụng thư viện lớp tôi sẽ làm được điều này ...

public class ClientApplication 
{ 
    void main() 
    { 
     ClassLibrary myCL = new ClassLibrary(); 
     myCL.DeviceAttached += new EventHandler(myCl_deviceAttached); 
    } 

    void myCl_deviceAttached(object sender, EventArgs e) 
    { 
     //do stuff... 
    } 
} 

Trả lời

1

Tôi nghĩ bạn nên thay đổi quan điểm của mình về cách hoạt động của sự kiện. OtherClass nên "sở hữu" sự kiện và kích hoạt nó. ClassLibrary hoặc ClientApplication (tùy theo bạn chọn) "lắng nghe" sự kiện bằng cách "đăng ký" với nó và thực hiện một hành động nào đó khi sự kiện này xảy ra.

Làm thế nào để thực hiện điều này:

public class ClassLibrary 
{ 
    public OtherClass myOtherCl; 

    public ClassLibrary() 
    { 
     myOtherCl= new OtherClass(); 
     myOtherCl.Start(); 
    } 
} 

Kích hoạt sự kiện trong lớp nơi nó một cách hợp lý xảy ra, nơi nó được phát hiện.

public class OtherClass : Form 
{ 
    public event EventHandler DeviceAttached; 

    public Start() 
    { 
     // do things here to initialize receiving messages 
    } 

    protected override void WndProc (ref message m) 
    { 
     if (....) 
     { 
      OnDeviceAttach(); 
     } 
     base.WndProc(ref m); 
    } 

     public void OnDeviceAttach() 
     { 
      if (DeviceAttached != null) 
       DeviceAttached(); 
     } 

} 

Cuối cùng, bất kỳ ai cần nghe sự kiện cần quyền truy cập vào cá thể của lớp tổ chức sự kiện, đó là lý do tại sao myOtherCl được công khai trong ví dụ này.

public class ClientApplication 
{ 
    void main() 
    { 
     ClassLibrary myCL = new ClassLibrary(); 
     myCL.myOtherCl.DeviceAttached += new EventHandler(myCl_deviceAttached); 
    } 

    void myCl_deviceAttached(object sender, EventArgs e) 
    { 
     //do stuff... 
    } 
} 
+0

Như một sang một bên, hãy chắc chắn rằng bạn sao chép xử lý sự kiện trước khi bắn nó cho an toàn thread: 'var ev = DeviceAtached; if (ev! = null) ev(); ' – Tanzelax

8

Bạn không thể làm điều này. Sự kiện chỉ có thể được nâng lên từ bên trong lớp tuyên bố sự kiện.

Thông thường, bạn muốn thêm một phương thức trên lớp học của bạn để nâng cao sự kiện này, và gọi phương thức:

public class ClassLibrary 
{ 
    public event EventHandler DeviceAttached; 
    public void NotifyDeviceAttached() 
    { 
     // Do processing and raise event 
    } 

Sau đó, trong mã khác của bạn, bạn muốn chỉ cần gọi myCL.NotifyDeviceAttached();

+0

NotifyDeviceAttached có cần tĩnh không? Nếu không, làm thế nào để tôi tham chiếu đến thể hiện của ClassLibrary từ OtherClass khi OtherClass không tạo ra nó? – PICyourBrain

+0

Bạn sẽ cần phải cung cấp biểu mẫu của bạn với một trường hợp thích hợp. Nếu không, bạn có thể làm cho NotifyDeviceAttached tĩnh, nhưng sau đó bạn cũng sẽ cần phải thực hiện xử lý sự kiện của bạn một sự kiện tĩnh, quá ... Đó là tất cả một vấn đề của thiết kế. –

1

tổ chức sự kiện các trình xử lý chỉ có thể được gọi trực tiếp bởi lớp đã khai báo chúng. Nếu bạn cần gọi số ClassLibrary.DeviceAttached từ bên ngoài lớp học đó, bạn cần phải thêm một phương thức tiện ích như sau:

public void OnDeviceAttached() 
{ 
    DeviceAttached(); 
} 
+0

hmmm ok. Sự kiện có thể được chuyển đến lớp như một tham chiếu và được gọi theo cách đó không? – PICyourBrain

+0

@Jordan S: Không. Các nhà thiết kế C# cố ý tạo ra nó để bạn không thể nâng cao một sự kiện từ một lớp khác, thậm chí là một lớp con. Bạn PHẢI làm điều đó từ lớp đã tuyên bố sự kiện. –

+0

Có OnDeviceAttached cần phải tĩnh? Nếu không, làm thế nào để tôi tham chiếu đến thể hiện của ClassLibrary từ OtherClass khi OtherClass không tạo ra nó? – PICyourBrain

1

Bạn có thể không muốn sử dụng sự kiện nào cả ở đây. Đây là một sự đơn giản hóa, nhưng nói chung một sự kiện là một cái gì đó được nêu ra bởi một thành phần con khi nó cần truyền đạt một cái gì đó về cho cha mẹ của nó. Trong trường hợp của bạn (tôi đang suy luận từ mã của bạn), biểu mẫu của bạn đang lắng nghe một thông điệp cụ thể (khi một thiết bị được đính kèm?) Và khi nó phát hiện ra thông báo cần nói myCL về nó. Với mục đích này, thay vào đó bạn chỉ cần tạo một phương thức trong ClassLibrary và gọi nó từ biểu mẫu của bạn.

+0

Ví dụ của tôi bỏ qua rất nhiều chi tiết. OtherClass không thực sự là một hình thức có thể nhìn thấy, nó chỉ thừa kế từ Form để nó có thể được sử dụng để nắm bắt các tin nhắn Windows khi thiết bị USB được đính kèm/nhận được ... Tôi biết nó khó hiểu. – PICyourBrain

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