我正在尝试重构我的项目,以便代替很多函数,而不是我会有一些对象。
我正在编写一个应用程序,它通过串行端口与特定的光学扫描器进行通信。我使用通常的SerialPort类方法
(写入,打开,关闭)和一些高级方法,它们不包含在标准类中,如ActivateLaser(它将特定字节写入SerialPort)。
我迈出了第一步:我创建了一个新类,它继承了SerialPort类并添加了我自己的方法,比如ActivateLaser。该项目编译为dll,然后包含在我的主项目中。
现在我想更进一步,也包括听SeiralPort到我的dll。它现在如何工作:首先我将DataReceived事件分配给我的扫描仪(扫描仪是我自己的SerialPort类的实例):
scanner.DataReceived += MyDataReceivedEventHandler;
然后在MyDataReceivedEventHandler中我调用一个委托,它在RichTextBox或DataGridView中显示接收的数据:
private void MyDataReceivedEventHandler(object sender, SerialDataReceivedEventArgs e)
{
...
this.BeginInvoke(new DisplayDataDelegate(DisplayData), receivedText);
...
}
private void DisplayData(string receivedText)
{
// display received text in RichTextBox in one project, display received text in DataGridView in another project
}
现在我想知道,我怎样才能在MySerialPort类中实现对串口的监听。如果我只是为DataReceived添加事件处理程序,那么将MyDataReceivedEventHandler绑定到scanner的语句将如下所示:
scanner.DataReceived += scanner.MyDataReceivedEventHandler;
我只是不知道如何把所有这些放在一起(我应该在MySerialPort类中定义MyDataReceivedEventHandler,我应该在哪里放置委托来显示文本,我怎样才能在RichTextBox或DataGridView中显示文本,... 。)
我知道我的问题有点复杂,但我真的想更好地组织我的工作,以便我可以在另一个项目中使用MySerialPort类......
谢谢!
答案 0 :(得分:1)
我建议您在SerialPort
的实施中提高自定义事件。此事件可以包含传递到应用程序UI层的数据,您可以在RichTextBox
中显示该数据。这会将扫描仪类与UI控件分开,这意味着您无需在扫描仪类中引用RichTextBox
。
作为示例,您可以创建一个名为DocumentScanned
的自定义事件和一个名为EventArgs
的{{1}}派生的类,以包含事件数据。
在DocumentScannedEventArgs
实施中,您可以处理SerialPort
事件,然后在收到新数据时引发DataReceived
事件。您的UI可以订阅此事件以接收扫描的文本并按照您的喜好显示它。
某些事情(假设您使用的是C#3.0):
DocumentScanned