2013-06-24 53 views
0

大家好我编码的地方我的功能如下,在我的form1中我会有一些文本框和一个datagridview,当用户点击编辑datagridview时,form2会弹出如果用户做出一些改变,我将更新的变化,重新绑定datagridview的,这是我的代码更新Form1中更新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

您正在创建一个与原始实例无关的新的Form1实例(也许还没有显示相同的数据),因此您的更新代码将作用于此表单实例(隐藏),并且不会更改原始实例中的任何内容。

解决这个问题是通过Form1的实例到窗体2的构造最简单的方法,节省内部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

公共委托无效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) 
} 
2

使用如下因素代码,它会解决你的问题

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

//Form1 f=new Form1(); 
    callingform.UpDateData(dt); 
    this.close();