2016-05-14 4 views
-2

У меня есть 2 формы: Form1 и Form2.Передача переменных между 2 формами, многопоточность C#

Форма 1 содержит кнопку вызова 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();    
     } 
    } 
} 

Form2

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 Поскольку это всего лишь образец, я попытался сделать это максимально простым. У меня тяжелая задача, которая требует много времени для обработки и должна выполняться в другом потоке, чтобы избежать замораживания графического интерфейса. Если я смогу найти решение для этого примера, я могу применить его в своем реальном приложении. –

+0

Является ли Form2 обязательной формой или просто фоновой нитью? См. Http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c –

ответ

1

Вы можете добавить событие в класс Form2 объявлен таким образом

public delegate void onMessageReady(string message); 
public event onMessageReady MessageReady; 

и когда ваш Form2 имеет сообщение, готовое отправить обратно клиентам интересно узнать об этом вызвать событие 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, когда вы построить экземпляры формы2

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

Смежные вопросы