вызов одной дочерней формы из другой дочерней формы в c # - PullRequest
3 голосов
/ 03 февраля 2010

У меня есть 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. Теперь для этого мне нужно будет создать еще один экземпляр FormC в событии click кнопки в FormB или я смогу использовать экземпляр, созданный в FormA ???

Если необходимо создать отдельный экземпляр, может кто-нибудь, пожалуйста, объяснит причину этого?

edit- ответ, который дал Одед, меня устраивает. но могу ли я сделать тип возврата свойства как Form [], чтобы добавить более 1 ссылки, чтобы, если я хочу вернуться из FormC в FormB, я мог бы использовать подобный метод?

также, если я хочу передать некоторые данные из FormB в FormC, как я могу это сделать?

Ответы [ 6 ]

2 голосов
/ 03 февраля 2010

Ваш FormB нуждается в ссылке на FormC.

Вы можете добавить свойство на FromB, чтобы сделать это:

public Form FormCRef {get;set;}

Тогда в вашей основной форме:

formB.FormCRef = formC;

И в вашем FormB классе сделайте это в вашем обработчике событий:

FormCRef.Show();
1 голос
/ 14 июня 2013

в форме A (MDIForm):

FormB formB = new FormB();     
formB.MdiParent = this; 
formB.Show();

В форме B:

FormC formC = new FormC();
formC.MdiParent = (FormA)this.ParentForm;
formC.Show();
this.Close();
1 голос
/ 03 февраля 2010

Вы должны использовать экземпляры, созданные в 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();
}
0 голосов
/ 24 марта 2012

Это зависит от характера вашего проекта:

Если для 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
    }
...
0 голосов
/ 03 февраля 2010

Чтобы уменьшить связывание, рекомендуется использовать шаблон MessageBroker / EventBroker / EventAggregator. Вы можете найти реализацию здесь или здесь

Использование:

Объявить класс события:

public class ShowFormCEvent {}

Подписаться на событие в форме А:

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

Запустить событие в FormB

EventPublisher.Publish(new ShowFormCEvent());
0 голосов
/ 03 февраля 2010

Альтернатива (и, возможно, весьма противоречивая опция) заключается в сохранении ссылки на каждую форму в виде статической переменной в каждой форме. Если вы когда-нибудь захотите, чтобы один экземпляр этой формы отображался одновременно, тогда этот метод должен подойти. Он известен как шаблон 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, показывающий (что в любом случае делает ваш код), то это логичный способ !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...