2015-11-06 76 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