2015-11-06 78 views
0

我想讓form2在關閉時將文本框中的文本傳遞給form1。爲什麼form2將空白變量傳遞給form1?

我有2個窗體如圖所示。 當form2打開時,當我輸入文本,然後單擊「發送文本到form1」什麼也沒有發生,文本不會傳遞給form1(form2關閉,但form1中的文本框仍然爲空)。

我不知道什麼是錯的。任何人都可以幫我做什麼? 謝謝

photo

Form1中:

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

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.Show(); 

     textBox1.Text = frm2.p; 

    } 
} 

窗體2:

public partial class Form2 : Form 
{ 

    string a; 

    public string p 
    { 

     get { return a; } 
    } 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     a = textBox1.Text; 
     this.Close(); 
    } 
} 
+0

因爲一旦你表現出來,它留下的按鈕單擊處理程序和'frm2.p'還沒有確定呢。一旦你將它設置在form2的'button1_Click'中,你需要告訴表單1再次更新。 –

+0

你應該真的努力改進你的變量名稱。像「a」,「p」'frm2「等變量比有意義的變量名稱更難理解。 – Servy

回答

1

解決這個最簡單的方法是顯示窗口2的對話框來代替:

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

    private void button1_Click(object sender, EventArgs e) 
    { 
     Form2 frm2 = new Form2(); 
     frm2.ShowDialog(); //<-- This line changed. 
     //With using ShowDialog(), the code pauses here until frm2 is closed 
     //and then resumes on the next line. 

     textBox1.Text = frm2.p; 

    } 
} 

問題是,當您單擊表單1中的按鈕時,它會顯示form2,然後立即讀取frm2.p變量,而無需等待用戶在form2中更新它。如果你想保留它,你需要告訴form1再次更新自己。

+0

嗨,Ron Beyer。我用ShowDialog代替它,它工作。你解釋得很好:)。非常感謝你先生 – naouf

1

如果用戶是能夠使用Form1,而第二種形式是開放的(和它在這些情況下,典型的爲它實際上是非常重要的,他們使用它),然後只需使用ShowDialog,而不是這並不重要Show顯示第二種形式,然後您的代碼將工作。

如果第二個表單不是模態是很重要的,那麼您需要使用一個事件來更新第一個表單,因爲它現在正在使用第二個表單的值在顯示錶單之後更新文本框,並且用戶當時還沒有輸入數值。這裏是你如何使用事件來更新第一種形式:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 frm2 = new Form2(); 
    frm2.Show(); 

    fm2.FormClosed += (s, args) => textBox1.Text = frm2.p; 
} 
+0

嗨Servy。我用ShowDialog代替它,它工作。現在我將不得不看到ShowDialog和show之間的區別。謝謝你,先生 – naouf