我想自动从第二个(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;
}
}
}
错误:对象引用未设置为对象的实例。
答案 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();
}