如何在关闭子窗体时刷新DataGridView?

21

我在主窗体上有一个数据网格视图(dgv),有一个按钮可以打开另一个窗体来插入一些数据到与dgv绑定的数据源中。我希望当子窗体关闭时,dgv能够自动刷新。我尝试在子窗体关闭事件中添加代码来实现刷新,但是没有成功:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
        {
            frmMain frmm = new frmMain();

            frmm.itemCategoryBindingSource.EndEdit();
            frmm.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
            frmm.dataGridView1.Refresh();
        }

但是,当我将这段代码添加到父表单的按钮中时,它实际上起作用了:

        this.itemCategoryBindingSource.EndEdit();
        this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
        this.dataGridView1.Refresh();
4个回答

40

有许多方法可以实现这一点,但以下是最简单的方法,它可以做到你想要的并让你开始。

  • 在你的主窗体上创建一个公共方法。
  • 修改第二个窗体的构造函数以接受一个主窗体对象。
  • 创建第二个窗体的实例并传递主窗体对象。
  • 在关闭第二个窗体时,调用主窗体对象的公共方法。

Form1

public partial class Form1 : Form {
    public Form1() {
        //'add a label and a buttom to form
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e) {
        Form2 oForm = new Form2(this);
        oForm.Show();
    }
    public void PerformRefresh() {
        this.label1.Text = DateTime.Now.ToLongTimeString();
    }
}

表单2

public class Form2 : Form {
    Form1 _owner;
    public Form2(Form1 owner) {
        _owner = owner;
        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form2_FormClosing);
    }
    private void Form2_FormClosing(object sender, FormClosingEventArgs e) {
        _owner.PerformRefresh();
    }
}

@rockyashkumar:代码分为Form1和Form2两部分。我会更新答案。 - AMissico

1
我们也可以这样操作:
我们有form_1和form_2。
1. 在form_1中创建一个公共方法。在这个公共方法中,我们放置我们的内容; 2. 在form_2中,创建一个全局表单变量; 3. 仍然在form_2中,通过form_2构造函数将form_1传递到form_2中; 4. 仍然在form_2中,使您的全局变量(我们在步骤2中创建的变量)接收我们在form_2构造函数中创建的新的form_1实例; 5. 在closing_event方法中,调用包含我们内容的方法。
我们的内容方法是填充我们的form1列表、dataGridView、comboBox或任何我们想要的内容的方法。
Form_1:
public fillComboBox()//Step 1. This is the method with your stuff in Form1
{
     foreach(var item in collection myInfo)
     {myComboBox.Items.Add(item)}

}

Form_2:
Form1 instanceForm1;//Step 2
public Form2(Form1 theTransporter)//Step 3. This the Form2 contructor. 
{ 
    InitializeComponent();
    instanceForm1 = theTransporter;//Step 4
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    instanceForm1.fillComboBox();//Step 5 we call the method to execute the task updating the form1
}

希望它有所帮助...


0
你正在创建一个新的主窗体实例,但这并不影响实际的主窗体实例。你需要做的是,在主窗体本身上调用代码,就像你在按钮单击事件中所说的那样。
private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
{
    this.itemCategoryBindingSource.EndEdit();
    this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
    this.dataGridView1.Refresh();
}

frmNew中不包含这些项的定义,我必须创建frmMain的一个实例来访问它们。 - DanSogaard

0

非常好的答案!另一种方法是:

  1. 检查您要更新的表单是否已打开。
  2. 调用刷新 gridVieW 的方法。

    **在 form1 中的 refreshMethod() 内部,确保将 datasource 设置为 null **

 if (System.Windows.Forms.Application.OpenForms["Form1"]!=null)
            {
                (System.Windows.Forms.Application.OpenForms["Form1"] as Form1).refreshGridView("");
            }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接