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

C# 使用C从第二个表单获取值#,c#,visual-studio,C#,Visual Studio,我想自动或按第二张表格上的按钮从第二张表格(表格2到表格1)中获取值,但我不能 我能从form1到form2得到值,但没有form2到form1 我试试这个 private void button1_Click(object sender, EventArgs e) { Form1 ytr = new Form1(); ytr.totalcost.Text = textBox3.Text; } 不起作用 更新(表格2上的代码) 错误:对象引用未设

我想自动或按第二张表格上的按钮从第二张表格(表格2到表格1)中获取值,但我不能

我能从form1到form2得到值,但没有form2到form1

我试试这个

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

    ytr.totalcost.Text = textBox3.Text;
}
不起作用

更新(表格2上的代码)


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

您正在创建
Form1
的新实例,但从未显示它。相反,您希望在已有的
Form1
实例上设置值

大概
Form1
创建并显示
Form2
的一个实例,是吗?由于
Form2
希望与
Form1
交互,因此它应该需要对它的引用。将该要求添加到
表单2
构造函数中。大概是这样的:

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;
}

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

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

表格2:

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);
}
您可以将
SetTotalCost
定义为:

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

您从不显示
Form1
ytr
实例。您是否已经显示了一个实例?表单是如何关联的?您可以创建一个公共类来传输所需内容。在
ytr
中创建一个名为
\u TotalCost
的私有变量,然后创建一个名为
TotalCost
的公共getter。在该getter中返回
\u TotalCost
。或使用
Application.OpenForms.OfType().First().TotalCost.Text=“…”
假定只有一种类型为
Form1
@TimSchmelter的开放形式:我可能会说这是隐藏依赖项而不是显式地宣传它,但这只是掩盖了我不知道
Application.OpenForms
的事实。当然,这也行。对象引用未设置为对象的实例。@NAWAFWABS:这称为
NullReferenceException
。这和这个问题有什么关系?@NAWAFWABS:那么看来你在什么地方犯了个错误。更新问题以包含您编写的新代码,并明确指出引发异常的位置以及哪个对象为
null
var form2 = new Form2(this); // u dont need to pass form1
form2.OnSetTotalCost = SetTotalCost;
form2.Show();
private void SetTotalCost(int totalCost)
{
  txtTotalcost.Text = totalCost.ToSttring();
}