2016-05-14 10 views
-2

Ich habe 2 Formulare: Form1 und Form2.Übergabe von Variablen zwischen 2 Formen, Multithreading C#

Form1 enthält eine Schaltfläche, um Form2 aufzurufen und es auf einem anderen Thread auszuführen.

Form2 enthält 3 Kontrollkästchen. Wenn ein Benutzer auf die Schaltfläche Hinzufügen klickt, wird eine Zeichenfolge generiert.

Meine Frage ist, wie kann ich die Zeichenfolge an Form1 übergeben und dann in die Richtextbox hinzufügen?

Danke.

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

Können Sie erklären, warum Sie versuchen, Ihre zweite Form in einem anderen Thread auszuführen? – Steve

+0

@Steve Da dies nur ein Beispiel ist, habe ich versucht, dies so einfach wie möglich zu machen. Ich habe eine schwere Aufgabe, die viel Zeit benötigt, um verarbeitet zu werden, und muss auf einem anderen Thread ausgeführt werden, um das Einfrieren der GUI zu vermeiden. Wenn ich eine Lösung für dieses Beispiel finden kann, kann ich es in meiner echten App anwenden. –

+0

Ist Form2 notwendigerweise eine Form oder nur ein Hintergrund-Thread? Siehe http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c –

Antwort

1

Sie könnten einen Termin in Ihrem Form2 Klasse auf diese Weise erklärt hinzufügen

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

und wenn Ihr Form2 hat eine Botschaft bereit, zu den Kunden zurück zu senden interessiert zu wissen, über sie das Ereignis MessageReady nennen

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

Der letzte Schritt ist, um das Ereignis von Ihrem Form1 zu abonnieren, wenn Sie die bauen Instanzen von 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

Wenn Form2 auf einem anderen Thread ausgeführt wird, müssen Sie das Steuerelement aufrufen, das Sie ändern. Siehe auch http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c –

+0

@BenjiWa das ist richtig. – Steve

Verwandte Themen