簡體   English   中英

在c#中從另一個子表單調用一個子表單

[英]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實例(這是你的代碼似乎正在做什么),那么這是合乎邏輯的方式!

要減少耦合,最佳做法是使用MessageBroker / EventBroker / EventAggregator模式。 你可以在這里這里找到一個實現

用法:

聲明事件類:

public class ShowFormCEvent {}

訂閱FormA中的活動:

EventPublisher.Register<ShowFormCEvent>(e=>formC.Show());

在FormB中觸發事件

EventPublisher.Publish(new ShowFormCEvent());

這取決於您的設計的性質:

如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM