本文转自:
问:
I have the following code which needs the data to be read from port and then display in a textbox. I am using DataReceived event handler for this purpose but donot know how to display this data in textbox. From various sources i learnt that Invoke method should be used for this but donot know how to use it. Suggestions please...
private void Form1_Load(object sender, EventArgs e) { //SerialPort mySerialPort = new SerialPort("COM3"); mySerialPort.PortName = "COM3"; mySerialPort.BaudRate = 9600; mySerialPort.Parity = Parity.None; mySerialPort.StopBits = StopBits.One; mySerialPort.DataBits = 8; mySerialPort.Handshake = Handshake.None; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived); mySerialPort.Open(); } private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string s= sp.ReadExisting(); // next i want to display the data in s in a textbox. textbox1.text=s gives a cross thread exception } private void button1_Click(object sender, EventArgs e) { mySerialPort.WriteLine("AT+CMGL=\"ALL\""); } 答:
The MSDN contains a good with examples about using control methods and properties from other threads.
In short, what you need is a delegate method that sets the Text
property of your text box with a given string. You then call that delegate from within your mySerialPort_DataReceived
handler via the TextBox.Invoke()
method. Something like this:
public delegate void AddDataDelegate(String myString);public AddDataDelegate myDelegate;private void Form1_Load(object sender, EventArgs e){ //... this.myDelegate = new AddDataDelegate(AddDataMethod);}public void AddDataMethod(String myString){ textbox1.AppendText(myString);}private void mySerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){ SerialPort sp = (SerialPort)sender; string s= sp.ReadExisting(); textbox1.Invoke(this.myDelegate, new Object[] {s}); }