我试着写一个应用程序,我需要通过COM端口使用扫描仪。我为它使用了一个启用的SerialPort对象,扫描在主窗体中工作正常。
然后,我使用一个按钮来切换主窗体是否能够执行ReadExisting()
方法。
private void ScannerDataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();`
if (string.IsNullOrEmpty(indata))
{
return;
}
Invoke(new MethodInvoker(delegate { cbValues.SelectedItem = values; }));
}
catch (Exception ex)
{
log.Error($"{ex}");
}
}
(cbValues是一个组合框)(系统.IO.端口.串行端口)
在我的主窗体中,我使用此命令创建一个新窗体:
var form = new Form2(_data, scanner);
form.ShowDialog();
然后表单按预期显示。第一次尝试时,当我在新表单中扫描东西时,一切正常。
然后关闭“child”窗体。
然后我重新打开它,它被显示出来,scanner事件被触发。
这是我的构造函数:
InitializeComponent();
HandleCreated += new EventHandler((sender, args) =>
{
scanner.DataReceived += new SerialDataReceivedEventHandler(ScannerDataReceivedHandler);
});
在我的事件中,我尝试调用组合框中的更改。
BeginInvoke(new MethodInvoker(delegate { cbValues.SelectedItem = values; }));
在我第二次尝试时,表单没有创建(IsCreated = false),也没有句柄(IsHandleCreated = false),尽管它是可见的,并且对扫描程序有React。
我不能完全理解它,我也尝试过using
这个表单来在使用后处理它,但是它不起作用。
有人猜到了吗?
2条答案
按热度按时间okxuctiv1#
我仔细阅读了你的帖子和代码。据我所知,
scanner
是MainForm
的成员变量,你将它作为参数传递给Form2
构造函数。不仅仅是猜测,我看到的是一种迂回的方式,订阅事件,一旦scanner
示例化,* 应该 * 在主表单 * 中 * 附加 * 一次。8iwquhpp2#
我解决了。
它很丑,但很有效。
我希望未来的我会有一个很好的解决方案。
解决方案:通过
scanner.Close()
关闭SerialPort
对象并以另一种形式打开它。扫描完所有内容后,关闭
Form2_FormClosing(object sender, FormClosingEventArgs e)
上的对象。