C# 如何使用serialPort DatatReceived事件更改tabControl中的活动选项卡?

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

我的C#Windows窗体应用程序有问题,我正在尝试更改tabControl1中的活动选项卡,当我单击按钮1时,它会工作,但当我发送串行数据时,页面会更改,但程序会崩溃。
串行数据由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事件查看器中会记录一些更详细的内容