Winforms - 如何从当前窗体到 MainWindow 窗体创建新选项卡和 TabPage

Winforms - How to create new tab and TabPage from current form to MainWindow form

我有一个 MainWindow 表单,其中包含 TabControl 组件,动态单击 menuItem 我创建了一个新选项卡和 TabPage。新创建的 TabPage 包含新的 Form.

新开TabPage,其中包含新Formen.ProductsDataGridViewwith products列表。当我双击 Products 表单中 DataGridview 中的一个单元格时,我想打开新的 tabPage 到 Mainwindow

dataGridView1_CellContentDoubleClick -> 在主页面打开新标签 window

MainWindow 我创建:

private void ProductListToolStripMenuItem_Click(object sender, EventArgs e)
{
    ProductForm = f = new Form();

    CreateTabPage(f);
}

private void CreateTabPage(Form form)
{
    form.TopLevel = false;

    TabPage tabPage = new TabPage();
    tabPage.Text = form.Text;
    tabPage.Controls.Add(form);

    mainWindowTabControl.Controls.Add(tabPage);
    mainWindowTabControl.SelectedTab = tabPage;

    form.Show();
}

Product 表单我想将数据发送到 MainWindow 表单以创建已在 MainWindow.

中定义的新 TabPage
public partial class Product: Form
{
   private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
         // create new tab page to MainWindow form
    }
}

我没有使用 MDI,我认为如果不创建新的 MainWindow 实例并传递参数,这是不可能的。在我的例子中,MainWindow 已经打开,如果我关闭 MainWindow,所有的都将被关闭。

知道如何解决这个问题吗?

在 MainWindow 上创建一个 属性,将 mainWindowTabControl 公开为 属性

public System.Windows.Forms.TabControl MainTabControl
{
  get 
  {
     return mainWindowTabControl;
  }
}

现在,Product 表单上有一个 属性,MainFormRef,因此当您创建 Product 表单的实例时,将 MainWindow 的引用传递给它:

Product p = new Product();
p.MainFormRef = this;

现在使用它来添加新标签:

public partial class Product: Form
{
    public Form MainFormRef { get; set; }
    private void dataGridView1_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
    {
         // create new tab page to MainWindow form
         TabPage tabPage = new TabPage();
         tabPage.Text = form.Text;
         tabPage.Controls.Add(form);

         MainFormRef.MainTabControl.Controls.Add(tabPage);
         MainFormRef.MainTabControl.SelectedTab = tabPage;
    }
}