Как изменить активную вкладку в tabControl с событием serialPort DatatReceived? - PullRequest
0 голосов
/ 21 мая 2018

У меня проблема с моим приложением C # Windows Form, я пытаюсь изменить активную вкладку в tabControl1, она работает, когда я нажимаю на кнопку 1, но когда я отправляю последовательные данные, страница меняется, но программа вылетает.
Последовательные данные отправляются Arduino, он посылает только "S" каждые 2 секунды.

Вот код, который я использовал для проверки этого:

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();
    }
}    

Этоошибка, или я делаю это неправильно?

1 Ответ

0 голосов
/ 21 мая 2018

Событие DataReceived возникает во вторичном потоке при получении данных от объекта SerialPort.

https://msdn.microsoft.com/fi-fi/library/system.io.ports.serialport.datareceived(v=vs.110).aspx

, вам необходимо использовать метод invoke для измененияэлементы пользовательского интерфейса основного потока формы.

//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);

Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...