大家好我编写了我的功能如下,在我的form1中我将有一些文本框和一个datagridview,当用户点击datagridview form2的编辑时将弹出窗口,如果用户做了一些更改,我会更新更改并重新绑定datagridview这是我的代码
// Form1代码
public void UpDateData(DataTable dt)
{
dataGridView1.Refresh();
dataGridView1.DataSource = dt;
updateTextBoxes();
}
public void updateTextBoxes()
{
// Some caluculation based on the datagridview rows
}
Form2按钮点击代码
private void button1_Click(object sender, EventArgs e)
{
// Some code to collect the changes made
Form1 f=new Form1();
f.UpDateData(dt);
this.close();
}
除了updateTextBoxes方法之外,每个东西都可以正常工作,这不是根据需要更新文本框可以帮助我
答案 0 :(得分:2)
您正在创建一个与原始实例无关的Form1的新实例(可能没有显示相同的数据),因此您的更新代码将作用于此表单实例(顺便隐藏)并且不会更改原始实例中的任何内容。
解决此问题的最简单方法是将Form1的实例传递给Form2的构造函数,将此实例保存在Form2中并使用此保存的实例调用更新
在form1.cs
中 Form2 f = new Form2(this);
f.Show();
在form2.cs
中Form1 _callingInstance;
public Form2(Form1 caller)
{
_callingInstance = caller;
}
private void button1_Click(object sender, EventArgs e)
{
_callingInstance.UpDateData(dt);
this.Close();
}
对此 InterForm通信问题稍微好一点的方法是创建和使用Custom Event。在这种情况下,Form2在完成更改后,会尝试通知每个对其更改感兴趣的客户端,他们需要更新其数据。 Form1订阅从Form2引发的事件,并在通知时更新其数据....
这种方法被认为更好,因为两种形式之间的耦合较少。
在form2.cs
中public delegate void OnUpdateData(); 公共事件OnUpdateData UpdateData;
private void button1_Click(object sender, EventArgs e)
{
if(UpdateData != null) UpdateData();
this.Close();
}
在form1.cs
中 Form2 f = new Form2();
f.UpdateData += myCallbackUpdateMethod;
public void myCallbackUpdateMethod()
{
DataTable dt = GetTable();
UpDateData(dt)
}
答案 1 :(得分:2)
使用以下代码,它将解决您的问题
不要创建表单的新实例。而是创建对调用表单的引用,然后在调用表单
中调用UpdateData()方法 //Form1 f=new Form1();
callingform.UpDateData(dt);
this.close();