FormClosing not fired

G

Guest

Hi,

When I close a specific form (not the main form) , the FormClosing event is
called.
When I close via the main form while another form is open, the event on the
above form is not fired.

What could be the problem?

Thanks
Bart
 
M

Martin Maat

Bart said:
When I close a specific form (not the main form) , the FormClosing
event is called.
When I close via the main form while another form is open, the event
on the above form is not fired.

What could be the problem?

It seems that the child form is just disposed of without first being closed.
This is correct behavior, after all the form is never closed, it is just
destroyed.

If OnClosing would be fired you would have a good case to complain: "I never
closed the bloody thing! What are you guys thinking?!"

So if you desperately want to perform some action before you "lose" the form
(not necessarily by closing), you may want to put your code in Dispose
instead. Or in a finalizer/destructor, assuming the form goes out of scope
after it is closed.

Code in OnClosing makes no sense unless you have some condition that would
have to prevent the form from being closed. You could make an OnClosing for
your main form and check for visibility of your child form. If the child
form is visible, perform whatever code you want executed first or (not so
nice) tell the user he has to close the child form first and cancel the
close action.

Martin.
 
L

Linda Liu [MSFT]

Hi Bart,

When we close the main form, all the other forms of the application will be
destroyed and the application will exit. At this time, only the main form's
FormClosing event is raised. This behavior is by design.

If you have validation code in this event that must be executed, you should
call the Form.Close method for each open form individually in the
FormClosing event handler of the main form. You could add a public property
e.g. CloseCancel of type bool in each open form and set this property in
the FormClosing event of the open form. Then you check the value of this
property of each open form in the FromClosing event of the main form. If
one open form has the value of 'false' for this property, cancel the
FormClosing event of the main form by setting the
FormClosingEventArgs.Cancel to true.

FYI, if the form is an MDI parent form, the FormClosing event of MDI child
forms are raised before the MDI parent form's FormClosing event is raised
when the user closes the MDI parent form. Canceling the FormClosing event
of an MDI child form does not prevent the FormClosing event of the MDI
parent form being raised. However, canceling the event will set true to the
Cancel property of the CancelEventArgs that is passed as a parameter to
the parent form.

Hope this helps.
If you have anything unclear, please feel free to let me know.


Sincerely,
Linda Liu
Microsoft Online Community Support

==================================================
Get notification to my posts through email? Please refer to
http://msdn.microsoft.com/subscriptions/managednewsgroups/default.aspx#notif
ications.

Note: The MSDN Managed Newsgroup support offering is for non-urgent issues
where an initial response from the community or a Microsoft Support
Engineer within 1 business day is acceptable. Please note that each follow
up response may take approximately 2 business days as the support
professional working with you may need further investigation to reach the
most efficient resolution. The offering is not appropriate for situations
that require urgent, real-time or phone-based interactions or complex
project analysis and dump analysis issues. Issues of this nature are best
handled working with a dedicated Microsoft Support Engineer by contacting
Microsoft Customer Support Services (CSS) at
http://msdn.microsoft.com/subscriptions/support/default.aspx.
==================================================

This posting is provided "AS IS" with no warranties, and confers no rights.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top