Search code examples
c#parent-childformclosing

C# SqlConnection child form closing, but data is not updated in MainForm


My first question to this forum, so please be kind :D

I'm building a desktop application in C# that should read data from a Raspberry Pi and show it (values, charts...). The MainForm.cs has a menu strip where I can call a child form, ConnectionSetupForm.cs where I can enter the database connection values (db user, password, table, host, port, etc.) which are stored as Properties.Settings.Default.xxx (System.Configuration).

When I'm closing this child form with a save button, I want the MainForm to get this information and refresh. This works, but only after I restart the application, but it should be when the FormClosing or FormClosed event of the child form happens (in my example the MessageBox.Show() never occurs).

What am I missing? I have no errors and no warnings.

MainForm calls the child form ConnectionSetupForm:

private void showConnectionForm(object sender)
{
    connectionSetupForm = new ConnectionSetupForm();
    connectionSetupForm.MdiParent = this.ParentForm;
    connectionSetupForm.StartPosition = FormStartPosition.CenterParent;
    connectionSetupForm.ShowDialog();

    connectionSetupForm.FormClosed += new FormClosedEventHandler(ConnectionForm_FormClosed);
}

private void ConnectionForm_FormClosed(object sender, FormClosedEventArgs e)
{
    Properties.Settings.Default.Save();   
    Properties.Settings.Default.Reload();
    MessageBox.Show("Closed");      // is never called, so this method is never called...

    // actually, I want to do some stuff here, e.g.:
    this.Text = Properties.Settings.Default.ApplicationName;    // name is changed after restart only
    connectionSetupForm = null;
}

Solution

  • This looks to be a simple mis-ordering of a couple lines. The connectionSetupForm.ShowDialog(); line is actually a call to a blocking function. This means nothing past this line will execute until AFTER your dialog closes. Because you add the FormClosed event handler after the form has already closed, the ConnectionForm_FormClosed() function never gets called.

    Try simply putting the FormClosed event handler before the connectionSetupForm.ShowDialog(); line.

    private void showConnectionForm(object sender)
    {
        connectionSetupForm = new ConnectionSetupForm();
        connectionSetupForm.MdiParent = this.ParentForm;
        connectionSetupForm.StartPosition = FormStartPosition.CenterParent;
        connectionSetupForm.FormClosed += new FormClosedEventHandler(ConnectionForm_FormClosed);
        connectionSetupForm.ShowDialog();
    }