I am having the same problem and the closing event is not helping very much!
I have an mdi child that I only ever want one instance of. I have declared and created a member variable in mdi parent and when user requests it the child is shown. I put code in Child_Closing to stop the object being disposed when it's X is clicked. (If I allow it to dispose normally I am left with a reference in parent that is not set to null yet tries to access a disposed object throwing an exception if used.) When I try to show this child again from parent it is re-displayed. Only one can be shown. However, when I click X on mdi parent the child is closed and the parent remains open! I then have to click X on parent again to close application. I need to catch code in either child or parent X-click to provide the behaviour I want. The closing event on child form has Sender parameter set to itself whether caused by a click on itself or parent. How can I tell when I really do want to allow this form to dispose of itself or not? The code I placed in closing event on parent does not execute until after my child has been disposed. When I click X on parent first time this code is not executed at all, presumably because my code in child closing event set e.Cancel = true; and this was passed back up. However next time it just closes parent. Is this because the Closing event is only triggered on 'visible' child forms? Are there any guidelines for best-practice on windows form interaction? You can read messages from the DOTNET archive, unsubscribe from DOTNET, or subscribe to other DevelopMentor lists at http://discuss.develop.com.