从Form2更新datagridview时更新Form1中的文本框

时间:2013-06-24 10:49:35

标签: c# winforms

大家好我编写了我的功能如下,在我的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方法之外,每个东西都可以正常工作,这不是根据需要更新文本框可以帮助我

2 个答案:

答案 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();