2013-03-02 39 views
1

我的问题是改变大量的另一个线程的TextBox.text比UI线程。 像这样:如何更改比UI线程更多的另一个线程的TextBox.text(使用相同的功能)?

string bufferSerial; 
. 
. 
. 
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    bufferSerial += serialPort1.ReadLine(); 
    TextBox1.text = bufferSerial; 
    TextBox2.text = bufferSerial; 
    TextBox3.text = bufferSerial; 
    TextBox4.text = bufferSerial; 
    TextBox5.text = bufferSerial; 
    TextBox6.text = bufferSerial; 
    TextBox7.text = bufferSerial; 
. 
. 
. 
. 
. 
. 
    TextBoxN.text = bufferSerial; 
} 

如果我试图做到这一点我有一个错误:控制“textBox1的”从比它创建的线程以外的线程访问。

要改变一个文本框,我可以使用此解决方案:

delegate void SetTextCallback(string text); 

private void SetText(string text) 
{ 
    // InvokeRequired required compares the thread ID of the 
    // calling thread to the thread ID of the creating thread. 
    // If these threads are different, it returns true. 
    if (this.textBox1.InvokeRequired) 
    { 
    SetTextCallback d = new SetTextCallback(SetText); 
    this.Invoke(d, new object[] { text }); 
    } 
    else 
    { 
    this.textBox1.Text = text; 
    } 
} 

,然后调用这样的功能:

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    bufferSerial += serialPort1.ReadLine(); 
    SetText(bufferSerial); 
} 

但是,如果我需要改变很多BoxText我有为每一个创建一个函数?

谢谢你的帮忙! 此致敬礼。

+0

您可以将您正在使用的语言添加到标签吗? – 2013-03-02 15:08:07

回答

0

否,创建一个方法,它改变了文本框的所有 - 并援用:

// We assume this will always be called from a non-UI thread... 
private void HandleDataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    bufferSerial += serialPort1.ReadLine(); 
    Action<string> d = SetAllTextBoxes; 
    Invoke(d, bufferSerial); 
} 

private void SetAllTextBoxes(string text) 
{ 
    textBox1.Text = text; 
    textBox2.Text = text; 
    textBox3.Text = text; 
    textBox4.Text = text; 
    ... 
} 

理想情况下,你不得不文本框集合中,所以你可以把它改写为:

private void SetAllTextBoxes(string text) 
{ 
    foreach (var textBox in textBoxes) 
    { 
     textBox.Text = text; 
    } 
} 
+0

谢谢乔恩!是完美的作品! :D @Jon Skeet – 2013-03-02 15:20:56

相关问题