【问题标题】:Winforms add tabPage from child form to parent formWinforms将tabPage从子表单添加到父表单
【发布时间】:2016-12-15 15:59:47
【问题描述】:

我想在父表单中添加其他表单的新标签页。

我的父表单是MainWindow,这个表单有TabControl。 我有子表单ChildForm 当我单击子表单按钮时,我想从MainWindowTabControl 添加新标签页。

我尝试在 ChildForm 中创建构造函数依赖项

private MainWindow mainWindow;   

public List(MainWindow form)
{
   this.mainWindow = form;
}

private void createButton_Click(object sender, EventArgs e)
{
    TabPage tabPage = new TabPage("ASD");

    mainWindow.MainTabControl.TabPages.Add(tabPage);
}

这将抛出System.NullReferenceException

我也尝试在MainWindow 中创建访问器,女巫将在MainWindow 中返回mainTabControl 访问,但也不起作用。

public static TabControl MainTabControl
{
   get {
        MainWindow self = new MainWindow();

        return self.mainTabControl;
    }
}

这不起作用,因为我创建了新的参考,这是问题。

我尝试了 2 个示例,但都不起作用,我知道为什么不起作用!!!

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

【问题讨论】:

  • 您的第一个示例虽然不是最佳实践,但应该可以工作。您可以使用调试器找出该表达式中的 null 值吗? mainWindow.MainTabControl.TabPages.Add(tabPage);
  • null 是因为我从不创建 MainWindow 类的实例。
  • 控件的默认Modifiers 值为Private,这意味着您无法从其他窗体访问TabControl。几乎可以肯定,例外是因为您尝试通过属性将其公开。您可以简单地将 TabControl 的 Modifiers 值更改为 Public 或 Internal,然后使用它的实际名称,例如:mainWindow.tabControl1.TabPages.Add(tabPage);
  • Idle_Mind 问题是空引用。我可以创建它公共的,这将再次不起作用,因为引用为空......没有对象

标签: c# winforms tabcontrol


【解决方案1】:

更好的方法是将创建新标签页的任务留给 MainWindow,并且不要让子窗体知道 MainWindow 的任何内部细节。子窗体公开一个事件,当它们想要通知父窗体是时候创建一个新的标签页(或 MainWindow 想要做的任何事情)时,它们会引发它。 MainWindow 订阅此事件并在请求时开始创建新标签页....

public class ListForm: Form
{
    public delegate void OnNewTabPage(string key);
    public event OnNewTabPage NewTabPage;

    public ListForm()
    {
       .....
    }

    private void createButton_Click(object sender, EventArgs e)
    {
        // Here we pass to the subscriber of the event just a string as 
        // the delegate requires, but, of course, you could change this 
        // to whatever data you wish to pass to the mainwindow 
        // Event a reference to an instance of a class with many fields...
        NewTabPage?.Invoke("ASD");
    }
}

主窗体中的代码

ListForm f = new ListForm();
f.NewTab += CreateTabPage;
f.Show();

private void CreateTabPage(string key)
{
    TabPage page = new TabPage(key);
    this.TabControl.TabPages.Add(page);
}

【讨论】:

  • 你不懂我! MainWIndow 只需要持有TabControl 实例。从其他表单中,我想在现有 tabcontro 的 MainWindow 中添加 tabPages。为每个新选项卡添加这个示例,我需要在 MainWindow 中编写新代码并通知 MainWindow 以获取该新表单
  • 那我就明白了。当您在我的知识中谈论父母和孩子时,这意味着您的 MainWindow 创建了 ChildForm 因此 MainWindow 存在(因此我已经评论了您的第一个示例)这是错误的吗?如果是错误的,那么谁创建了 ChildForm?为什么在创建新的 TabPage 时需要更改 MainWindow?您在任何子窗体中编写的相同代码应该放在主窗口中,如果您创建一个对标签页具有不同要求的新子窗体,它只是您编写相同代码的不同位置。你说得对,我不明白。
  • 嗨,你能解释一下你为什么使用.Invoke()吗?
  • Steve 先生,我的想法是拥有一个主窗口(父窗口),而所有其他表单都是子窗口。所有孩子都有工具栏按钮。当在孩子我点击按钮我想在父母中添加新的标签页。我希望所有表单都在新选项卡中打开,不管那是在子工具栏操作中。在这个例子中,我总是需要编写我想要打开的新表单对象。对不起,我的英语不好
  • @mcNets 仅在有订阅者时引发事件。 (如果 NewTabPage != null) NewTabPage("ASD");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多