7

I created a UserControl with the buttons Save, Close and Cancel. I want to close the form without saving on the Cancel button, prompt a message to save on the Close button and Save without closing on the Save button. Normally, I would have used this.Close() on the Cancel button, but the UserControl doesn't have such an option. So I guess I have to set a property for that.

Scrolling down the "Questions that may already have your answer" section, I came across this question: How to close a ChildWindow from an UserControl button loaded inside it? I used the following C# code:

private void btnCancel_Click(object sender, EventArgs e)
{
    ProjectInfo infoScreen = (ProjectInfo)this.Parent;
    infoScreen.Close();
}

This does the job for one screen, but I wonder if I have to apply this code for all the screen I have? I think there should be a more efficient way. So my question is: Do I need to apply this code for every form I have, or is there another (more efficient) way?

Community
  • 1
  • 1
FJPoort
  • 225
  • 2
  • 7
  • 16

4 Answers4

24

you can use

((Form)this.TopLevelControl).Close();
Tobia Zambon
  • 7,479
  • 3
  • 37
  • 69
  • Mine answer did the trick for what I use it for (indeed the control is directly embedded in the form). But I like yours better – FJPoort Nov 26 '12 at 10:52
7

you can use the FindForm method available for any control:

private void btnCancel_Click(object sender, EventArgs e)
{
    Form tmp = this.FindForm();
    tmp.Close();
    tmp.Dispose();
}

Do not forget to Dispose the form to release resources.

Hope this helps.

Lionel D
  • 317
  • 1
  • 10
1

You also can close one form in any part of the code using a remote thread:

            MyNamespace.MyForm FormThread = (MyNamespace.MyForm)Application.OpenForms["MyForm"];
            FormThread.Close();
0

I found the simple answer :) I all ready thought of something like that.

To close a WinForm in a ButtonClicked Event inside a UserControl use the following code:

private void btnCancel_Click(object sender, EventArgs e)
{
    Form someForm = (Form)this.Parent;
    someForm.Close();
}
FJPoort
  • 225
  • 2
  • 7
  • 16
  • it depends if the usercontrol is directly embedded in the form or in other sub-controls. using TopLevelControl should make the trick – Tobia Zambon Nov 23 '12 at 11:24