Para você abrir o outro formulário no mesmo formulário, você deve definir este teu formulário(Form1) como formulário pai(Propriedades MdiParent) e então, quando chamar, setar que o seu "Form2 é um formulário filho.
Exemplo:
Para definir o Formulário 1 como pai, vá na propriedade “MdiParent” e deixe setado true.
Ao habilitar o modo MdiParent, o seu formulário ficará cinza e as cores/imagens definidas como background, não serão visíveis.(É possível alterar isto via código em tempo de execução no evento Load do mesmo…)
Agora na hora de chamar o formulário 2, faça da seguinte maneira.
var form = new Form();
form.MdiParent = meuForm1;
form.Show();
Obs.: Quando for exibir um formulário filho e chamar com a propriedade ShowDialog();, a aplicação dará uma exceção e vai parar a sua aplicação. Por isto use o evento Show();
Pronto, agora o seu formulário dois, vai abrir dentro do formulário um.
Para você abrir o outro formulário e fechar o anterior, você vai perder as informações do anterior.
Para fechar o formulário, pode usar o form.Close();. Porém, se o formulário um neste caso, for o seu formulário principal da aplicação(oque está configurado para inicializar a aplicação), quando ele fechar, toda a sua aplicação será fechada junto. Então neste caso, poderá utilizar o form.Hide();. Que neste caso, ele vai “esconder” na memória e vai continuar a executar as linhas de códigos abaixo normalmente sem encerrar a sua aplicação.
Exemplo abaixo:
var form2 = new Form2();
this.Hide();//vai “esconder” o formulário atual
form2.show(); ou form2.ShowDialog();.
Lembrando que para o exemplo acima, não tem a necessidade de abrir no mesmo formulário, desative a propriedade MdiParent, setando ela como false
Para você passar informação de um formulário para o outro, um exemplo é você utilizar variáveis.
Em relação “esconder” um formulário na memória, existe boas práticas que poderá executar em sua aplicação para limpar estes formulários da memória.