2013-08-21 47 views
0

我正在使用WinForm應用程序。我有幾個表單。我希望能夠從任何兒童形式訪問我的主窗體。我能夠通過自定義按鈕功能來完成此操作,並捕獲Form_Closing事件。我有一個問題,但我會在下面解釋。從任何子窗體訪問現有的主要winform實例

主窗體上的代碼如下:

ChildForm form = new ChildForm(); // Create new Child Form instance 
form.Show(); // Show Child form 
this.Hide(); // Hide Main form 

使用 「this.Hide();」意味着主窗體仍然存在於內存中,並且仍在工作,它只是隱藏而已,這正是我想要的。

子形式

MainForm form = new MainForm(); // Create new Main Form instance 
form.Show(); // Show Main Form 
this.Close(); // Close Child Form 

上的代碼這當然除了我的第二碼塊(子窗體正上方),代碼的第一行中,將創建的主要形式的一個新實例。這是我的問題,我不想創建該表單的新實例,我想要顯示已經存在的隱藏實例(我隱藏在上面第一個代碼塊中的主表單)。

我嘗試以下代碼兒童形式:

this.Parent.Show(); 

但我得到此運行時錯誤消息: 「System.NullReferenceException了未處理:消息=對象引用不設置爲一個對象的一個​​實例」 。

我明白錯誤是什麼意思,我只是沒有創建一個對該主表單的引用或者如何以任何形式引用它的代碼。

請提出任何提示?

提前感謝。

+1

通過形式參考通過構造函數'form2(IWin32Window parent)' – Sayse

回答

1

這應該做到這一點。因爲這些是單線程形式,所以函數將等到您關閉表單後再繼續。

ChildForm form = new ChildForm(); // Create new Child Form instance 
this.Hide(); // Hide Main form 
form.ShowDialog(); // Show Child form, wait for closing 
this.Show(); 

您還可以在MainForm中附加ChildForm關閉事件。

public MainForm() 
{ 
    ChildForm form = new ChildForm(); 
    form.FormClosed += OnClosed; 
} 
public void OnClosed(object sender, EventArgs e) 
{ 
    this.Show(); 
} 
+0

謝謝!這工作。如果你只是掌握了相關知識,它會讓我感到驚訝。這回答了我的問題。謝謝。 (我如何設置我的問題,但回答?:)) –

+0

@YousefImran在帖子的左側有一個複選標記的輪廓。點擊它接受答案。 – Servy

2

您可以爲您的其他形式的構造函數,在窗口作爲一個參數

private Form MyParent { get; set; } 
public Form1(Form parent) 
{ 
    MyParent = parent; 
} 

MyParent.Show(); 

其中MyParent是形式的屬性

您可以通過new ChildForm(this)

調用此

編輯

我只是看着,不知道爲什麼我不能用一個構造函數爲IWin32WindowShow有一個重載需要,其中一個將Owner設置爲一個父窗體

new ChildForm().Show(this); 
ChildForm.Owner //returns MainForm (parent) 
+0

我得到該行'this.ParentForm = parent'的2個語法錯誤,第一個錯誤表示屬性'ParentForm'是隻讀的。第二個錯誤是它不能隱式地從'System.Windows.Forms.IWin32Window'轉換爲'Sytem.Windows.Forms.Form',存在明確的轉換。 –

+0

哦對不起,我沒有意識到已經有一個父窗體參數(我的意思是它作爲一個屬性創建),第二個我覺得令人驚訝,雖然...你可以使用'Form'來代替IWin32Window ..我'我試圖找出原因 – Sayse

+0

@YousefImran - 我已編輯答案的版本,將工作.. – Sayse