2010-02-22 14 views
5

Diğer uygulamalar tarafından kullanılacak bir Sınıf Kitaplığı yazıyorum. Ben C# .NET'de yazıyorum. Sınıflar arasında olayları tetikleme ile ilgili bir sorun yaşıyorum. İşte ... Yapmam gerekenler Bunu yapacak sınıf kitaplığı kullanıyor uygulamada SonraSınıflar arasında bir etkinliği nasıl tetiklersiniz?

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); 
    } 

} 

...

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

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

cevap

1

Olayların nasıl çalıştığına dair bakış açınızı değiştirmelisiniz. OtherClass olayı "sahiplenmeli" ve tetiklemelidir. ClassLibrary veya ClientApplication (hangisini seçerseniz seçin) etkinliğe "abone" ile "dinler" ve bu olay gerçekleştiğinde belirli bir eylem yapar.

Bu nasıl uygulamaya:

public class ClassLibrary 
{ 
    public OtherClass myOtherCl; 

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

Trigger tespit edildiğinde, ayrıca mantıksal olur, sınıfta bir olay. myOtherCl bu örnekte kamuoyuna neden

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(); 
     } 

} 

Son olarak, kim olay olay tutan sınıfın örneğine erişim ihtiyacı dinlemek gerekiyor olmasıdır.

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

Bir kenara göre, iş emniyeti için iş parçacığını emniyete almadan önce kopyaladığınızdan emin olun: 'var ev = DeviceAtached; eğer (ev! = sıfır) ev(); ' – Tanzelax

8

Sen bunu yapamaz. Etkinlikler, yalnızca etkinliği bildiren sınıf içinden yükseltilebilir.

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

Ardından, diğer kodda, sadece myCL.NotifyDeviceAttached();

+0

NotifyDeviceAttached Statik olmak zorunda mı? Aksi takdirde, OtherClass tarafından oluşturulmadığında, diğer sınıfın ClassLibrary örneğine nasıl başvurulur? – PICyourBrain

+0

Formunuzu uygun bir örnekle sağlamanız gerekir. Aksi takdirde, NotifyDeviceAttached statik yapabilirsiniz, ancak daha sonra olay işleyicinizi de statik bir olay haline getirmeniz gerekir ... Her şey bir tasarım meselesi. –

1

Olay derim: Genellikle

, sen yöntemini olayı yükseltmek classınıza bir yöntem ekleyin ve derim İşleyicileri, yalnızca bunları bildiren sınıf tarafından doğrudan çağrılabilir. Eğer bu sınıfın dışından ClassLibrary.DeviceAttached çağırmak gerekiyorsa, aşağıdaki gibi bir yarar yöntemi eklemek gerekir:

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

hmmm tamam. Etkinlik sınıfa bir referans olarak geçebilir ve bu şekilde çağrılabilir mi? – PICyourBrain

+0

@Jordan S: Hayır. C# tasarımcıları, bunu bir başka sınıftan, hatta bir alt sınıftan bile bir olayı kaldıramayacak şekilde gerçekleştirdi. Bunu, etkinliği bildiren sınıftan yapmanız gerekir. –

+0

OnDeviceAttached'in statik olması gerekiyor mu? Aksi takdirde, OtherClass tarafından oluşturulmadığında, diğer sınıfın ClassLibrary örneğine nasıl başvurulur? – PICyourBrain

1

Hepiniz burada bir etkinliği kullanmak istemeyebilirsiniz. Bu bir aşırı basitleştirmedir, ancak genellikle bir olay, ebeveynine bir şey iletmesi gerektiğinde, bir alt bileşen tarafından yükseltilen bir şeydir. Sizin durumunuzda (kodunuzdan çıkarım) formunuz belirli bir mesajı dinliyor (bir cihaz eklendiğinde?) Ve bu mesajı görüntülediğinde, bunun hakkında myCL numarasını söylemesi gerekir. Bunun için, ClassLibrary'da bir yöntem oluşturup bunu formunuzdan çağırırsınız.

+0

Örneğim çok fazla ayrıntı bırakıyor. OtherClass aslında görünür bir form değil, sadece formdan miras alır, böylece USB aygıtı eklendiğinde/alındığında Windows mesajlarını yakalamak için kullanılabilir ... Kafa karıştırıcı olduğunu biliyorum. – PICyourBrain

İlgili konular