views:

550

answers:

2

I've a dgv on my main form, there is a button that opens up another form to insert some data into the datasource bounded to the dgv. I want when child form closes the dgv auto refresh. I tried to add this in child form closing event, but it doesn't refresh:

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

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

However, when I add this code in a button on the parent form, it actually does the trick:

        this.itemCategoryBindingSource.EndEdit();
        this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
        this.dataGridView1.Refresh();
A: 

You're creating a new instance of the main form which isn't effecting the actual main form instance. What you need to do is, call the code on the main form itself, just like the code you say works on the button click:

private void frmNew_FormClosing(object sender, FormClosingEventArgs e)
{
    this.itemCategoryBindingSource.EndEdit();
    this.itemsTableAdapter.Fill(myDatabaseDataSet.Items);
    this.dataGridView1.Refresh();
}
BFree
frmNew doesn't contain definitions for these items, I have to create an instance of frmMain to access them.
DanSogaard
+2  A: 

There are many ways to do this, but the following is the simpliest and it will do what you want and get you started.

  • Create a public method on your main form.
  • Modified constructor of second form to take a main form.
  • Create an instance of the second form passing the main form object.
  • When closing second form, call the public method of the main form object.

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();
    }
}
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();
    }
}
AMissico
Thank you very much :)
DanSogaard