C# 如何使用serialPort DatatReceived事件更改tabControl中的活动选项卡?
我的C#Windows窗体应用程序有问题,我正在尝试更改tabControl1中的活动选项卡,当我单击按钮1时,它会工作,但当我发送串行数据时,页面会更改,但程序会崩溃。C# 如何使用serialPort DatatReceived事件更改tabControl中的活动选项卡?,c#,winforms,C#,Winforms,我的C#Windows窗体应用程序有问题,我正在尝试更改tabControl1中的活动选项卡,当我单击按钮1时,它会工作,但当我发送串行数据时,页面会更改,但程序会崩溃。 串行数据由Arduino发送,每2秒仅发送“S” 下面是我用来测试的代码: public partial class Form1 : Form { int page = 0; public Form1() { InitializeComponent(); serialPo
串行数据由Arduino发送,每2秒仅发送“S” 下面是我用来测试的代码:
public partial class Form1 : Form
{
int page = 0;
public Form1()
{
InitializeComponent();
serialPort1.Open();
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
page++;
if (page == 4)
{
page = 0;
}
tabControl1.SelectedIndex = page;
tabControl1.Refresh();
}
private void button1_Click(object sender, EventArgs e)
{
page++;
if (page == 4)
{
page = 0;
}
tabControl1.SelectedIndex = page;
tabControl1.Refresh();
}
}
这是一个错误,还是我做得不对
读取数据时,在辅助线程上引发DataReceived事件
从SerialPort对象接收
您必须使用invoke方法来修改表单主线程UI元素
//Create a delegate
public delegate void ModifyTabPage();
//Create an object in the form for delegate and instatiate with the method which modifies tabpage
public ModifyTabPage myDelegate;
myDelegate = new ModifyTabPage(ModifyTabPageMethod);
public void ModifyTabPageMethod()
{
page++;
if (page == 4)
{
page = 0;
}
tabControl1.SelectedIndex = page;
tabControl1.Refresh();
}
//using invoke access it from the data recived event of your serialize port.
myFormControl1.Invoke(myFormControl1.myDelegate);
这应该会起作用。相关,假设崩溃是由跨线程异常引起的:崩溃时会出现什么错误?崩溃可能是由多种原因造成的…为了更好地帮助我们,我们需要了解异常的详细信息。没有错误代码,应用程序只是冻结,“应用程序已停止工作”,请删除编辑并将其作为答案写入。我来回答这个问题,假设它仍然打开,并意识到您已经修复了它。“应用程序只是冻结”希望在这种情况下,Windows事件查看器中会记录一些更详细的内容