[英]calling one child form from another child form in c#
我有3種形式:FormA,FormB和FormC,其中FormA是mdiParent形式,形式B和C是子形式。 我在FormA加載事件中編寫以下代碼。
private void frmMain_Load(object sender, EventArgs e)
{
formB.MdiParent = this; //formB is instance of FormB
formC.MdiParent = this; //formC is instance of FormC
formB.Show();
}
我想要的是當我點擊FormB上的一個按鈕時,應該顯示FormC。 現在要做到這一點,我需要在FormB中的按鈕單擊事件中創建另一個FormC實例,或者我應該能夠使用在FormA中創建的實例?
如果需要創建一個單獨的實例,那么有人可以解釋這樣做的原因嗎?
編輯 - Oded給出的答案很適合我。 但是我可以將屬性的返回類型設置為Form []以便添加多於1個引用,這樣如果我想從FormC返回到FormB,我可以使用類似的方法嗎?
如果我想將一些數據從FormB傳遞給FormC,那么我該怎么辦呢?
您的FormB
需要參考FormC
。
您可以在FromB
上添加屬性來執行此操作:
public Form FormCRef {get;set;}
然后在你的主要形式:
formB.FormCRef = formC;
在您的FormB
類中,在事件處理程序中執行此操作:
FormCRef.Show();
在FormA(MDIForm)中:
FormB formB = new FormB();
formB.MdiParent = this;
formB.Show();
在FormB中:
FormC formC = new FormC();
formC.MdiParent = (FormA)this.ParentForm;
formC.Show();
this.Close();
您必須使用在FormA中創建的實例,因為每個表單實例都會替換不同的表單。
正確的方法是公開FormB事件,將FormA注冊到它,然后FormA可以在FormC上調用你想要的任何內容:
FormB:
// A delegate type for hooking up change notifications.
public delegate void MagicEventHandler();
public event MagicEventHandler MagicButttonClicked;
// Invoke the event, this inside your button click event handler:
void Button1_OnClick(EventArgs e)
{
if (Changed != null) MagicButttonClicked();
}
FormA: //保存表單實例以供將來使用,作為FormB formB的私有成員; FormB formC;
OnLoad...
{
formB.MdiParent = this; //formB is instance of FormB
formC.MagicButttonClicked += new On_MagicButttonClicked ();
formC.MdiParent = this; //formC is instance of FormC
formB.Show();
}
public void On_MagicButttonClicked()
{
this.fromC.Activate();
}
另一種選擇(並且很可能是有爭議的選項)是將每個表單的引用存儲為每種形式的靜態變量。 如果您只想要在任何時候顯示此表單的一個實例,那么此方法應該沒問題。 它被稱為Singleton模式。
在表格C中有以下內容:
private static FormC thisForm = null;
public static FormC GetFormC()
{
if (thisForm == null)
thisForm = new FormC();
return thisForm;
}
public static void ShowFormC()
{
GetFormC().Show();
}
在表單A中,如果您需要在表單C上進行任何設置調用:
FormC.GetFormC().mdiParent = this;
然后在表單B中,顯示表單C進行以下調用:
FormC.ShowFormC();
它干凈,清晰,如果你絕對確定你只需要一個FormC實例(這是你的代碼似乎正在做什么),那么這是合乎邏輯的方式!
這取決於您的設計的性質:
如果FormB直接與FormC通信是有意義的,那么FormB需要引用FormC。 在這種情況下,我認為FormC可能不應與FormA相關,而FormB應該管理FormC。 (就像FormC是FormB的工具窗口一樣)。
如果FormB直接與FormC交談沒有意義,那么FormB應該向FormA“發送消息”(調用方法),FormA應該將消息發送給FormC。 例如:
class FormB
{
...
private void SomethingHappened()
{
((FormA)MdiParent).TellFormASomethingHappened();
}
...
class FormA
{
private FormC mFormC;
...
public void TellFormASomethingHappened()
{
mFormC.TellFormCSomethingHappened();
}
...
class FormC
{
public void TellFormCSomethingHapened()
{
// do something
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.