2013-03-03 31 views
2

我對C#很新穎 - 但一切都很順利 - 至此。傳遞一個類和一個表之間的值

我從一個表單和一個完成大部分工作的類(非靜態和程序部分)開始。我在表單1中實例化類的一個對象,並進行登錄。

然後我切換到下一個窗體form2。其實,這個班是這樣做的。我有一個方法,包含行:

this.f2 = new Form2(); 

然後:

f2.Show(); 

f2是類型的Form2類成員 - 和所有剛剛工作正常 - 到這一點。

這個Form2只是一個大的文本框,我想在其中顯示網絡事件。事件處理程序工作得很好 - 但對錶單的引用似乎不起作用。如果我這樣做

f2.tetBox1.Text = "Some text"; 

它只是不會改變文本框中的文本。

我在這裏做錯了什麼?

下面是我在做什麼的更詳細描述:

Form1通過一些日誌信息myProg,是的MyClass一個實例。如果登錄成功,Form1中調用myProg.makeForm();

這是在MyClass的方法是這樣的:

public void makeForm() { 
      this.f2 = new Form2(); 
      f2.Show(); 
      this.sendString("start f2"); 
} 

這是MyClass.sendString()

private void sendString(string text) { 
      SystemSounds.Beep.Play(); 
      this.f2.setTextBox(text); 
} 

這就要求,因爲你看到的,setTextBox()Form2 - 我按照這裏提出的方式實施。奇怪的是,到目前爲止,一切運作良好。 Form2顯示一個textBox1包含「開始f2」 - 正如所料。但是當事件進入時,textBox1中的文本不會改變。嘟嘟聲得到充分發揮 - 所以方法sendString()被稱爲好吧。

我觀察到的一件事:如果在呼叫this.f2.setTextBox(text);之後放置嘟嘟聲線,如果從事件處理程序調用該方法,則不會播放它。 。

f2,順便說一句,是MyClass一個私有成員:

private Form2 f2; 
+0

你是什麼意思'似乎沒有工作'。它是否編譯?你實際上是否收到錯誤信息? 'tetBox1'是'form2'的公共成員? – 2013-03-03 22:33:21

+1

請顯示**一些**的代碼 - 但不是兩個窗體的''.cs'文件的完整轉儲。 – Yuck 2013-03-03 22:34:07

+0

[表單之間共享數據]的可能重複(http://stackoverflow.com/questions/3800603/sharing-data-between-forms) – 2013-03-03 22:35:26

回答

3

由設計者創建的任何控制(例如從工具箱中丟棄在設計時)被自動設定爲私人。因此,您無法從其他表單訪問它。

你不想開始弄亂設計師,而是 - 在你的Form2上創建一個屬性,它允許你從Form1修改文本框的文本。

一個簡單的例子是這樣的:

窗體2:

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


    // When modifying the Text property it will change the text in textbox1 
    public string Text 
    { 
     get { return textBox1.Text; } 
     set { textBox1.Text = value; } 
    } 
} 

然後,在Form1中:

Form2 frm2 = new Form2(); 
frm2.Text = "123"; // Uses the public Text property declared in Form2 
frm2.Show(); 
+0

另請注意,OP將希望給該屬性一個比「文本」更有意義的名稱。首先,'Control'已經有一個'Text'屬性,這會影響,這是......不受歡迎的,無論如何,它應該對文本代表什麼更具描述性。 (顯然只有OP知道他的情況。) – Servy 2013-03-04 14:49:00

0

默認情況下,當您通過設計師將它放在一個文本框是私人,這意味着您無法從Form2外部訪問textBox1(它僅在Form2類中進行編碼「可見」)。您可以改變文本框是內部的或公共的(這將讓你做以下(從Form1中):

f2.tetBox1.Text = "Some text"; 

將被暴露窗體2的部分僅窗體2應該真正瞭解。因此它不是最乾淨的解決方案(雖然它可能是最快的解決方案))

更好的解決方案可能是在Form2中創建一個方法或屬性(內部或公共),它將設置文本值。例如: -

internal void SetText(string value) 
{ 
    textBox1.Text = value; 
} 

隨着法(或財產)位於Form2的,它可以訪問到文本框中,因此它可以設置的值,而textBox1的還是私有的。

它的安全暴露這種方法來「外部」代碼(而不是使文本顯示給他們),因爲所有他們能做的就是改變文本 - 而露出整個文本框可以讓來電者試圖改變背景顏色等