使用C#从第二个表单获取值

时间:2017-10-18 11:28:36

标签: c# visual-studio

我想自动从第二个(form2到form1)获取值,或者通过第二个表单上的按钮获取值但是我不能

我能够从form1到form2获取值,但没有form2到form1

我试试这个

private void button1_Click(object sender, EventArgs e)
{               
    Form1 ytr = new Form1();

    ytr.totalcost.Text = textBox3.Text;
}

不工作

更新(表格2上的代码)

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

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            multpl();
        }



        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            multpl();
        }

        private void multpl()
        {
            int a, b;

            bool isAValid = int.TryParse(textBox1.Text, out a);
            bool isBValid = int.TryParse(textBox2.Text, out b);

            if (isAValid && isBValid)
                textBox3.Text = (a * b).ToString();

            else
                textBox3.Text = "Invalid input";


        }

        private Form1 form1Instance { get; set; }

        public Form2 (Form1 form1)
        {
            this.form1Instance = form1;
        }



        private void button1_Click(object sender, EventArgs e)
        {



            this.form1Instance.totalcost.Text = textBox3.Text;


        }


    }
}

错误:对象引用未设置为对象的实例。

2 个答案:

答案 0 :(得分:1)

您正在创建Form1实例并且从不显示它。相反,您希望在已经拥有的Form1实例上设置值

大概Form1创建并显示Form2的实例,是吗?由于Form2期望与Form1进行交互,因此应该需要对其进行引用。在Form2构造函数中添加该要求。像这样:

private Form1 form1Instance { get; set; }

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

这种方式在创建Form2的实例时是必需的。因此,在Form1创建该实例时,您可以将引用传递给它自己:

var form2 = new Form2(this);
form2.Show();

然后在您的点击处理程序中,您可以引用您在该属性中保存的实例:

private void button1_Click(object sender, EventArgs e)
{
    this.form1Instance.totalcost.Text = textBox3.Text;
}

从这里开始,您甚至可以继续将功能重构为自定义简单类,而不是传递表单引用。您可以采取多种方法,包括自定义事件或某种类型的消息。但最终您需要引用{em>现有的实例Form1才能更改该实例上的任何内容,而不是创建 new

答案 1 :(得分:0)

解决此问题的最佳方法是使用委托:

Form2中的

public Action<int> OnSetTotalCost;
private void button1_Click(object sender, EventArgs e)
{
  Form1 ytr = new Form1();
  var talCost = int.parse(textBox3.Text);
  if(OnSetTotalCost != null) OnSetTotalCost(talCost);
}

和Form1类

var form2 = new Form2(this); // u dont need to pass form1
form2.OnSetTotalCost = SetTotalCost;
form2.Show();

你可以将SetTotalCost定义为:

private void SetTotalCost(int totalCost)
{
  txtTotalcost.Text = totalCost.ToSttring();
}