将值从一个表单传递到另一个表单

mar*_*rai 12 .net c# winforms

我有两种形式命名form1form2:

  • form1由a label和a组成button.
  • form2由a textBox和a组成button

单击form1按钮时,将显示此按钮form2.一旦我按下按钮,任何输入都textBox应该写回. 我有下面的代码,但它不起作用.form1.labelform2

// Code from Form 1
public partial class Form1 : Form
{
    public void PassValue(string strValue)
    {
        label1.Text = strValue;
    }
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2();
        objForm2.Show();
    }

}

// Code From Form 2

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

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 objForm1 = new Form1();
        objForm1.PassValue(textBox1.Text);
        this.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

截图:

应用截图

我怎么能意识到这一点?

mao*_*mao 16

您不能访问从中创建form2的form1.在form2 button1_Click中,您创建Form1的新实例,这与初始不同.您可以将form1实例传递给form2构造函数,如下所示:

   // Code from Form 1
 public partial class Form1 : Form
{
    public void PassValue(string strValue)
    {
        label1.Text = strValue;
    }
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2(this);
        objForm2.Show();
    }

}

// Code From Form 2

public partial class Form2 : Form
{
    Form1 ownerForm = null;

    public Form2(Form1 ownerForm)
    {
        InitializeComponent();
        this.ownerForm = ownerForm;
    }

    private void button1_Click(object sender, EventArgs e)
    {       
        this.ownerForm.PassValue(textBox1.Text);
        this.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)


Vel*_*uis 5

就像在其他帖子中提到的那样,您将无法通过创建Form1的新实例来引用原始Form1.您可以将Form1传递给Form2的构造函数或将Form2的文本公开为公共属性,但我通常更喜欢使用委托来维护松散耦合.

// Code from Form 1
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        Form2 objForm2 = new Form2();
        objForm2.PassValue += new PassValueHandler(objForm2_PassValue);
        objForm2.Show();
    }
    public void objForm2_PassValue(string strValue)
    {
        label1.Text = strValue;
    }
}

// Code From Form 2
public delegate void PassValueHandler(string strValue);
public partial class Form2 : Form
{
    public event PassValueHandler PassValue;

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (PassValue != null)
        {
            PassValue(textBox1.Text);
        }
        this.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)