2010-02-03 2 views
3

У меня есть 3 формы: FormA, FormB и FormC, форма FormA которых является mdiParent формой, а форма B и C - дочерними. Я пишу следующий код в событии загрузки FormA.вызов одной дочерней формы из другой дочерней формы в C#

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 в событии нажатия кнопки в FormB или мне нужно будет использовать instancce, созданный в FormA ???

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

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

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

ответ

2

Ваш FormB нуждается в реферанте до FormC.

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

public Form FormCRef {get;set;} 

Затем в основной форме:

formB.FormCRef = formC; 

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

FormCRef.Show(); 
+0

+1, я не люблю использовать ссылки формы, если не обязательно, но это хорошо решение – Amirshk

+0

мне нужно что-нибудь написать в свойстве FormCRef или оставить его так, как написано u hav ??? Извините за задание такого простого вопроса, но я никогда не создавал никаких свойств, поэтому не знаю много о них. –

+0

@Pratik Gandhi - синтаксис, который я использовал, в порядке. Он называется Automatic Properties и был введен в C# 3.0. – Oded

1

Вы должны использовать экземпляры, созданные в FormA, поскольку каждая форма instan ce reperesnt другая форма.

Правильный способ сделать это разоблачить 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

В качестве альтернативы, (и, вполне возможно, спорный вариант), чтобы иметь ссылку на каждую форму, сохраненной в качестве статического переменного в каждой форме. Если вы когда-либо захотите, чтобы один экземпляр этой формы показывался в любой момент времени, этот метод должен быть прекрасным.Он известен как Singleton pattern.

В форме C имеют следующие:

private static FormC thisForm = null; 

public static FormC GetFormC() 
{ 
    if (thisForm == null) 
    thisForm = new FormC(); 

    return thisForm; 
} 

public static void ShowFormC() 
{ 
    GetFormC().Show(); 
} 

В форме А, если вам нужно делать какие-либо настройки по форме C вызова:

FormC.GetFormC().mdiParent = this; 

А потом в форме B, чтобы показать форму C, позвоните по телефону:

FormC.ShowFormC(); 

Его чистый, чистый, и если вы Абсолютно верно, что вы когда-нибудь захотите один экземпляр показания FormC (что и делает ваш код в любом случае), тогда это логичный путь!

0

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

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

Объявляем класс событий:

public class ShowFormCEvent {} 

Subcribe на мероприятие в в Форме:

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

Огонь событие в FormB

EventPublisher.Publish(new ShowFormCEvent()); 
0

Это зависит от характера вашего дизайна:

Если это имеет смысл для 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

В 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(); 
Смежные вопросы