Only Dispose an object after everything is completely done with it. Trying to do anything with the object after it is disposed will result in undefined behavior. Think of it as freeing the memory.
Fortunately, Windows forms disposes these objects for you when you close the form. The only case you would need to dispose them in your code is if you remove the objects from the form.
Take a look at the .Designer.cs file, and you will see the form's Dispose() method:
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
The components.Dispose() will recursively clean up all the components on the form, including those in the panel.