2013-03-17 10 views
1

我不想为此完成代码,因为它是用于赋值的,但我的主要问题是从Program.cs中的类中获取文本以显示在Form.cs中的文本框。我已经尝试了几乎所有的东西,但我似乎仍然无法完成它的工作。我真的只想将我的Hello类中的文本显示在表单类的文本框中。这是我目前所面对的输入到不同类的文本框中C#

Program.cs中 - 主代码

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 
using System.Threading; 

namespaceWindows 
{ 

static class Program 
{ 

    public static Form1 form; 
    [STAThread] 

    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Thread thread1 = new Thread(new ThreadStart(open)); 
     thread1.Start(); 
     Thread thread2 = new Thread(new ThreadStart(open)); 
     thread2.Start(); 

    } 

    static void openForms() 
    { 

     form = new Form1(); 
     form.ShowDialog(); 
     Program1 p = new Program1(); 


    } 
    } 

public class Program1 
{ 
    private HELLO h; 
    public Program1() 
    { 


     h = new HELLO(); 
    } 
} 

public class HELLO 
{ 
    public HELLO() 
    { 
    Program.form.ThreadSafe("Hello "); 
    } 

} 
} 

Form1.cs的 - 如果文本框是

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

namespace Windows 
{ 
public partial class Form1 : Form 
{ 
    string input; 
    public delegate void SetTextCallback(string text); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 



    public void ThreadSafe(string text) 
    { 

     if (this.screenTextBox.InvokeRequired) 
     { 
      // It's on a different thread, so use Invoke. 
      SetTextCallback d = new SetTextCallback(SetText); 
      this.Invoke(d, new object[] { text + " (Invoke)" }); 
     } 
     else 
     { 
      // It's on the same thread, no need for Invoke 
      this.screenTextBox.Text = text + " (No Invoke)"; 

     } 
    } 



    // This method is passed in to the SetTextCallBack delegate 
    // to set the Text property of textBox1. 
    private void SetText(string text) 
    { 
     this.screenTextBox.Text = text; 
    } 

    } 

我知道代码可能没有意义,但是这是主要是因为我不得不编辑它,因为我无法在此处发布我的任务代码。任何人都可以看到我的问题是什么?为什么文本在打开时不会显示在表单中,我已经在网上尝试了多种解决方案,而且还是一无所获

回答

0

当你打电话form.ShowDialog();申请主线程将停在这里和Program1 p = new Program1();将不会运行,直到表单关闭事件调用。

的Program.cs

static class Program 
    { 

     [STAThread] 

     static void Main() 
     { 

      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Thread thread1 = new Thread(new ThreadStart(openForms)); 
      thread1.SetApartmentState(ApartmentState.STA); 
      thread1.Start(); 
     } 
     static Form1 frm; 
     static void openForms() 
     { 
      frm = new Form1(); 
      Program1 p = new Program1(); 
      Application.Run(frm); 
     } 

     public class Program1 
     { 
      private HELLO h; 
      public Program1() 
      { 
       h = new HELLO(); 
      } 
     } 

     public class HELLO 
     { 
      public HELLO() 
      { 
       frm._Form1.ThreadSafe("Hello "); 
      } 

     } 
    } 

Form1.cs的

public partial class Form1 : Form 
    { 
     public Form1 _Form1; 
     string input; 
     public delegate void SetTextCallback(string text); 

     public Form1() 
     { 
      InitializeComponent(); 
      _Form1 = this; 
     } 

     public void ThreadSafe(string text) 
     { 
      if (this.screenTextBox.InvokeRequired) 
      { 
       // It's on a different thread, so use Invoke. 
       SetTextCallback d = new SetTextCallback(SetText); 
       this.Invoke(d, new object[] { text + " (Invoke)" }); 
      } 
      else 
      { 
       // It's on the same thread, no need for Invoke 
       this.screenTextBox.Text = text + " (No Invoke)"; 

      } 
     } 



     // This method is passed in to the SetTextCallBack delegate 
     // to set the Text property of textBox1. 
     private void SetText(string text) 
     { 
      this.screenTextBox.Text = text; 
     } 
    } 

编辑两个线程

的Program.cs

static class Program 
    { 

     [STAThread] 

     static void Main() 
     { 

      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Thread thread1 = new Thread(new ThreadStart(openForms)); 
      thread1.SetApartmentState(ApartmentState.STA); 
      thread1.Start(); 
      Thread thread2 = new Thread(new ThreadStart(openForms)); 
      thread2.SetApartmentState(ApartmentState.STA); 
      thread2.Start(); 
     } 

     static void openForms() 
     { 
      Form1 frm = new Form1(); 
      Program1 p = new Program1(); 
      Application.Run(frm); 
     } 

     public class Program1 
     { 
      private HELLO h; 
      public Program1() 
      { 
       h = new HELLO(); 
      } 
     } 

     public class HELLO 
     { 
      public HELLO() 
      { 
       Form1._Form1.ThreadSafe("Hello "); 
      } 

     } 
    } 

对于m1.cs

public partial class Form1 : Form 
    { 
     public static Form1 _Form1; 
     string input; 
     public delegate void SetTextCallback(string text); 

     public Form1() 
     { 
      InitializeComponent(); 
      _Form1 = this; 
     } 

     public void ThreadSafe(string text) 
     { 
      Thread.Sleep(100); 
      if (this.screenTextBox.InvokeRequired) 
      { 
       // It's on a different thread, so use Invoke. 
       SetTextCallback d = new SetTextCallback(SetText); 
       this.Invoke(d, new object[] { text + " (Invoke)" }); 
      } 
      else 
      { 
       // It's on the same thread, no need for Invoke 
       this.screenTextBox.Text = text + " (No Invoke)"; 

      } 
     } 



     // This method is passed in to the SetTextCallBack delegate 
     // to set the Text property of textBox1. 
     private void SetText(string text) 
     { 
      this.screenTextBox.Text = text; 
     } 
    } 
+0

谢谢你,它适用于一个线程,但基本上我需要两个线程,每个打开窗体。你有一个想法如何去做这件事? – CodeCompileHack 2013-03-17 14:18:09

+0

@CodeCompileHack:查看我编辑的两个线程 – KF2 2013-03-17 14:25:00

相关问题