2012-03-15 14 views
0

OnSerialDataReceviedイベントハンドラを含むSystem.IO.Ports.SerialPortを処理するSerialPortWrapperクラスがあります。以下はそのクラスの概要であり、動作します。イベントを他のクラスに伝播してカスタマイズする方法は?

public class SerialPortWrapper : ISerialPortWrapper 
{ 
    public event SerialDataReceivedEventHandler DataReceviedHandler;  

    private readonly SerialPort _serialPort; 

    public SerialPortWrapper() 
    { 
     this._serialPort = new SerialPort 
     { 
      // configure SerialPort 
     }; 

     this._serialPort.DataReceived += DataReceviedHandler; 
     this._serialPort.DataReceived += OnSerialDataRecevied; 
    } 

    public void Write(byte[] bytes, int offset, int count) 
    { 
     this._serialPort.Write(bytes, offset, count); 
    } 

    public void OnSerialDataRecevied(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     var bytes = new UTF8Encoding().GetBytes(sp.ReadExisting()); 
    } 
} 

また、SerialPortWrapperを使用するクラスもあります。 OnSerialDataReceviedが発砲すると、このクラスでイベントが鳴りたいです。好ましくは、このイベントオブジェクトには、私がSerialPortWrapperのDataReceviedHandlerのハンドラとしてSecurityDataReceviedを追加しようとしましたが、それにはない、むしろあなたがそれ以下のコードで見ることができますSerialPortデータ

よりも、SecurityPanelはと懸念されることをカスタムデータが含まれています作業。

public class SecurityPanel : ISecurityPanel 
{ 
    private readonly ISerialPortWrapper _serialPortWrapper; 

    public SecurityPanel(ISerialPortWrapper serialPortWrapper) 
    { 
     _serialPortWrapper = serialPortWrapper; 

     _serialPortWrapper.DataReceviedHandler += SecurityDataRecevied; 
    } 

    private void SecurityDataRecevied(object sender, SerialDataReceivedEventArgs e) 
    { 
     // this doens't fire. Prefereably it would have a custom EventArgs object, 
     // rather than SerialDataReceivedEventArgs 
    } 

    public byte SendMessage(Message message) 
    { 
     // get bytes from message and send them to the SerialPort 
     _serialPortWrapper.Write(bytes, 0, bytes.Length);    
    } 
} 

私が持っている疑問は、私がSerialPortWrapperを使用しているクラスにイベントを伝播させることができますどのように

  • ですか?
  • 発生しているクラスに関連するこれらのカスタムイベントを作成するにはどうすればよいですか?

答えて

1

あなたは実際にイベントを起こしていません。

この行を削除します。

this._serialPort.DataReceived += DataReceviedHandler; 

と機能を変更します。

public void OnSerialDataRecevied(object sender, SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    var bytes = new UTF8Encoding().GetBytes(sp.ReadExisting()); 
    if(DataReceivedHandler != null) 
     DataReceivedHandler(sender, e); 
} 
+0

これは動作しません - 'DataReceivedHandler'は決して' SecurityPanel'クラスでは不明ではありませんし、とにかく 'SecurityDataRecevied'そのコードを実行するために最初に起動します。 – DaveDev

+0

@DaveDev、私の謝罪、私は間違った機能を修正しました。 –

+0

優秀、ありがとう!私は「Received」のスペルが正しくないことも発見しました:-) – DaveDev

関連する問題