2016-12-15 82 views
0

我想从父窗体中的其他窗体添加新窗体。Winforms从子窗体添加tabPage到父窗体

我的父母表格是MainWindow,此表格有TabControl。 我有孩子的形式ChildForm当我点击儿童表单按钮,我想要从添加新的tabpage。

我尝试在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中创建访问者女巫将返回mainTabControl访问MainWindow但也不起作用。

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

     return self.mainTabControl; 
    } 
} 

这不行,因为我创建新的参考,这是问题。

我尝试了2个例子,两者都不工作,我知道whay不工作!

任何人都知道任何其他操作如何解决这个问题?

+0

你的第一个例子,虽然它不是一个最佳实践,应该工作。你可以使用调试器来找出那个表达式中的null是什么? _mainWindow.MainTabControl.TabPages.Add(tabPage); _ – Steve

+0

'null'因为我从不创建'MainWindow'类的实例。 – Ivan

+0

Controls的默认'Modifiers'值是** Private **,这意味着您无法从其他Form访问TabControl。这个例外几乎肯定是因为你试图通过一个属性将其公开。您可以简单地将TabControl的Modifiers值更改为Public或Internal,然后使用它的实际名称,如:'mainWindow.tabControl1.TabPages.Add(tabPage);' –

回答

0

一个更好的方法是让任务创建新的窗口到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); 
} 
+0

你不理解我! 'MainWIndow'只需要持有'TabControl'实例。从其他形式我想要在现有的tabcontro的MainWindow内添加tabPages。对于每个新标签,我需要在MainWindow中写入新代码并通知MainWindow以获得新表格 – Ivan

+0

让我明白。当我在我的知识中谈到父母和孩子时,这意味着您的MainWindow创建了ChildForm,因此MainWindow存在(因此我已经评论了您的第一个示例)这是错误的吗?如果它是错误的,那么谁创建ChildForm?为什么在创建新的TabPage时需要更改MainWindow?您在任何子窗体中编写的代码应放置在主窗口中,并且如果您为该页面页创建了一个具有不同要求的新子窗体,则它只是您编写相同代码的不同位置。你说得对,我不明白。 – Steve

+0

嗨,可能你解释你为什么使用'.Invoke()'? – McNets

相关问题