2016-05-14 91 views
-2

我有2种形式:Form1和Form2。在2种形式之间传递变量,多线程C#

Form1包含一个按钮来调用Form2并在另一个线程上运行它。

Form2包含3个复选框。当用户点击添加按钮时,它会生成一个字符串。

我的问题是如何将字符串传递给Form1然后将其添加到richtextbox?

谢谢。

enter image description here

Form1中

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Threading; 

namespace PassingData2Forms 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void call_form_2() 
     { 
      for (int i = 0; i<10; i++) { 
      Form2 inst_form2 = new Form2(); 
      inst_form2.ShowDialog(); 
      } 
     } 

     private void f1_but_01_Click(object sender, EventArgs e) 
     { 
      Thread extra_thread_01 = new Thread(() => call_form_2()); 
      extra_thread_01.Start();    
     } 
    } 
} 

窗体2

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace PassingData2Forms 
{ 

    public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      Close(); 
     } 

     private string clean_string(string process_string) 
     { 
      process_string = process_string.Replace(",,", ","); 
      process_string = process_string.Trim(new char[] {','}); 
      return process_string; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string[] selected_array = new string[3]; 

      if (checkBox1.Checked == true) 
      { 
       selected_array[0] = "Summer"; 
      } 

      if (checkBox2.Checked == true) 
      { 
       selected_array[1] = "Spring"; 
      } 

      if (checkBox3.Checked == true) 
      { 
       selected_array[2] = "Fall"; 
      } 

      string selected_string = clean_string(string.Join(",", selected_array)); 

      //--------------------------------------------------------------- 
      // How can I pass "selected_string" to RichTextBox in Form1 here? 
      //--------------------------------------------------------------- 

      Close(); 
     } 
    } 
} 
+0

你能解释为什么你试图在另一个线程中运行你的第二个表单吗? – Steve

+0

@Steve因为这只是一个示例,我试图尽可能简化。我有一项繁重的任务需要大量的时间来处理,并且必须在不同的线程上运行以避免GUI冻结。如果我能找到这个示例的解决方案,我可以将它应用于我的真实应用程序。 –

+0

Form2必然是一种形式或只是一些后台线程?请参阅http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c –

回答

1

你可以添加一个事件以这种方式

0声明您的窗体2类

,当你的窗体2有消息随时发回给感兴趣的客户知道它叫MessageReady事件

private void button1_Click(object sender, EventArgs e) 
{ 
    ..... 
    string selected_string = clean_string(string.Join(",", selected_array)); 
    if(MessageReady != null) 
     MessageReady(selected_string); 
    ..... 
} 

最后一步是当你建立从您的Form1中订阅事件Form2的实例

private void call_form_2() 
{ 
    for (int i = 0; i<10; i++) { 
    Form2 inst_form2 = new Form2(); 
    inst_form2.MessageReady += MessageReceived; 
    inst_form2.ShowDialog(); 
    } 
} 
private void MessageReceived(string message) 
{ 
     if (form1RichTextBox.InvokeRequired) 
      form1RichTextBox.Invoke(new Form2.onMessageReady(messageReady), new object[] {message}); 
     else 
      form1RichTextBox.AppendText(message + Environment.NewLine); 
} 
+1

如果Form2在另一个线程上运行,则必须调用正在修改的控件。另见http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c –

+0

@BenjiWa这是正确的。 – Steve