Firstly, stop opening and closing the port: it won't help and it may cause data to be lost. While the port is closed, anything received by the physical port will be thrown away...and it allows other applications to "grab" the port as well. And you don't need an event handler to pass the data either.
So open the port once, add the DataReceived handler once, and send the data.
Then use the event to fetch all the data the PIC returns, and display it - but don't use an int to transfer it, as the RX thread could easily overwrite it before your UI thread gets a chance to read it and display it. Instead, read all the bytes in one go, and pass the data through to the UI thread via a Invoke method call:
string data = SerialPort1.ReadExisting();
Invoke(new MethodInvoker(() => { ShowData(data);}));
private void ShowData(string s)
{
textBox1.Text += s;
}