You don't need to explicitly call Dispose on the form, the garbage collector will do that for you
If you want something specific to happen when Form2 "goes away", you can hook into it's form closing event.
Hope this helps, if you've any more questions, just ask them in the comments.
Bye
BW
EDIT
On Form2, in the button click, try
this->Close();
That will close that instance of form2 (the form will disappear). If form1 still has a reference to form2, then form2 will not be picked up by the garbage collector, and the GC will not dispose of it.
If there is a reason for form1 to keep a reference to form2?
If so, form1 should handle from2's closing event, then form1 can release it's reference to form2 (set it to null).
Now the GC will pickup form2 as a candidate to be collected, it will (in possibly more than one step) call it's Dispose method and free up Form2's memory.
Is this sufficient for your purposes? If not, whats missing?