2016-12-15 81 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

相關問題