0

大家好,我的功能如下所示,在我的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 方法之外,一切都很好,这不是根据需要更新文本框有人可以帮助我吗

4

2 回答 2

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 Communication问题的一个稍微好一点的方法是通过创建和使用自定义事件。在这种情况下,Form2 在完成更改后,会尝试通知每个对其更改感兴趣的客户,他们需要更新他们的数据。Form1 订阅从 Form2 引发的事件,并在收到通知时更新其数据......
这种方法被认为更好,因为两个表单之间的耦合较少。

在form2.cs中

公共委托无效 OnUpdateData(); 公共事件 OnUpdateData 更新数据;

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)
 }
于 2013-06-24T10:51:58.107 回答
2

使用以下代码,它将解决您的问题

不要创建表单的新实例。而是创建对调用表单的引用,然后在调用表单中调用 UpdateData() 方法

  //Form1 f=new Form1();
   callingform.UpDateData(dt);
   this.close();
于 2013-06-24T10:54:43.443 回答