2017-10-06 49 views
1

這應該是非常簡單的,但我很努力地看到任何結果。爲什麼我無法與主程序中的表單對象進行交互?

我有以下形式的代碼:

//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.Threading.Tasks; 
using System.Windows.Forms; 

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

     protected TextBox textReadInfo; 
     public void SetReadInfo(String str) 
     { 
      txtReadInfo.Text = str; 
     } 
    } 
} 

我也有下面的程序代碼:

//Program.cs 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace NotepadRW 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Form1 form1 = new Form1(); 
      Application.Run(form1); 

      form1.SetReadInfo("Hi"); 

     } 
    } 
} 

這導致以下形式:

Blank Form

爲什麼它不顯示我提供的字符串嗎?我沒有正確理解程序如何與Windows窗體一起工作嗎?當調用Form1的新實例時,Program.cs的Main()方法的執行是否停止?

注:我已經嘗試過使用文本框和富文本框。相同的結果。

加分: 我是否正確封裝了封裝?我正在修改文本框以便公開訪問(這將起作用),但我認爲這將是「正確」的方式。

+0

是'txtReadInfo.Text = str'只是拼寫錯誤還是txtReadInfo定義的地方我們看不到? –

+0

爲什麼不在'InitializeComponent'調用之後'this.SetReadInfo(「Hi」)''? – dcg

+1

您正在* Application.Run之後分配該文本*。這會啓動GUI事件循環,直到主窗體關閉纔會退出。在表單構造函數和應用程序運行之間移動該行。 –

回答

4

雖然從the documentation不明顯,Application.Run(Form)方法塊。您可以從以下報價中推斷出此結果:

Form類的Dispose方法將在返回此方法之前調用。

這意味着表單將完成它的工作,並且必須在Run返回之前完成它的工作。即,它阻止。

你可以通過切換順序來完成你想要的。取而代之的

Form1 form1 = new Form1(); 
Application.Run(form1); 
form1.SetReadInfo("Hi"); 

嘗試

Form1 form1 = new Form1(); 
form1.SetReadInfo("Hi"); 
Application.Run(form1); 
+0

當我說下面的內容時,我正在想的是什麼?「當調用Form1的新實例時,Program.cs的Main()方法的執行是否停止?」「除了運行Form本身之外,program.cs是無用的?我的大部分工作應該在大多數程序的Form1.cs代碼中完成嗎? (儘可能簡單,包括這個) – DeeJayh

+0

取決於應用程序。對於一個簡單的Windows Forms應用程序,是的,將所有內容放在主表單中可能是最簡單的,因爲UX將以表單爲中心。如果您希望多出幾個線程,或者如果您的應用程序缺少「主要」表單,則會更多地使用應用程序類。 –

+0

你已經認真地提高了我對此的理解。我深深感謝您的快速和精心的迴應。 – DeeJayh

1

你不應該讓你的文本框中公開,否則你可能會得到跨線程執行的例外。

您的代碼不工作的原因是因爲您正在主線程上運行窗體,因此Application.Run()之後的任何內容都不會執行。您可以在單獨的線程上運行您的表單。

Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Form1 form = new Form1(); 

      System.Threading.Thread workerThread = new System.Threading.Thread(() => Application.Run(form)); 

      workerThread.Start(); 

      form.SetReadInfo("Hello"); 
+0

這是一個奇妙的技巧,將來對我有用。我確信這一點。由於這是一個單線程應用程序,需要最小的計算能力,因此我選擇了John的這個問題的答案。但是,一旦我進入多線程應用程序,您的答案將成爲我的出發點。謝謝。 – DeeJayh

相關問題