从面板内的表单打开面板中的表单

Open a Form in a Panel from a Form inside that Panel

我想在面板内打开一个表单,但我想从该面板内已有的表单打开该表单。 示例:我的面板名称是面板,我有 3 个表单,form1、form2、form3。

panel.Controls.Clear();
form2 myForm = new form2();
myForm.FormBorderStyle = FormBorderStyle.None;
myForm.TopLevel = false;
myForm.AutoScroll = true;
panel.Controls.Add(myForm);
myForm.Show();

现在我想用 form2 中的按钮打开 form3

private void button_Click(object sender, EventArgs e){
    form3 myForm = new form3();
    myForm.FormBorderStyle = FormBorderStyle.None;
    myForm.TopLevel = false;
    myForm.AutoScroll = true;
    panel.Controls.Add(myForm);
    myForm.Show();
    this.close();
}

那么如何将新表单添加到其他表单内的面板并关闭当前表单

首先处理面板中的所有内容,不要调用this.Close();(这将关闭您当前的表单):

private void button_Click(object sender, EventArgs e){
  Panel p = this.Parent as Panel;

  if (p != null) {
    while (panel.Controls.Count > 0) {
      panel.Controls[0].Dispose();
    }

    form3 myForm = new form3();
    myForm.FormBorderStyle = FormBorderStyle.None;
    myForm.TopLevel = false;
    myForm.AutoScroll = true;
    panel.Controls.Add(myForm);
    myForm.Show();
    // this.Close();
  }
}

调用 panel.Clear(); 不会释放控件,如果您一直添加和清除窗体和控件而不释放它们,则可能会导致内存泄漏。

编辑:

再次阅读你的问题后,你需要引用父属性来获取当前面板:

Panel p = this.Parent as Panel;
if (p != null) {
  form3 myForm = new form3();
  myForm.FormBorderStyle = FormBorderStyle.None;
  myForm.TopLevel = false;
  myForm.AutoScroll = true;
  p.Controls.Add(myForm);
  myForm.Show();
  this.Close();
}

在这种情况下,是的,您可以从 Form2 调用 this.Close(),因为那样只会关闭该表单。