2010-02-03 7 views
3

J'ai trois formulaires: FormA, FormB et FormC dont FormA est le formulaire mdiParent et les formulaires B et C sont des formulaires enfants. J'écris le code suivant dans l'événement de chargement FormA. Ce que je veux, c'est quand je clique sur un bouton sur FormB, FormC devrait être affiché. Maintenant, pour ce faire, je dois créer une autre instance de FormC dans l'événement click du bouton dans FormB ou devrais-je être capable d'utiliser l'instance créée dans FormA ???J'appelle un formulaire enfant d'un autre formulaire enfant dans C#

Si nécessaire pour créer une instance distincte, puis quelqu'un peut-il expliquer la raison pour cela?

edit- la réponse donnée par Oded me convient bien. mais puis-je faire le type de retour de la propriété sous forme [] afin d'ajouter plus de 1 références de sorte que si je veux revenir de FormC à FormB je peux utiliser une méthode similaire?

également si je veux passer des données de FormB à FormC alors comment puis-je faire cela?

Répondre

2

Votre FormB a besoin d'une référence à FormC.

Vous pouvez ajouter une propriété sur votre FromB pour ce faire:

public Form FormCRef {get;set;} 

ensuite dans votre principale forme:

formB.FormCRef = formC; 

Et dans votre classe FormB faire dans votre gestionnaire d'événements:

FormCRef.Show(); 
+0

+1, je n'aime pas utiliser des références de formulaire si pas obligatoire, mais il est un bon solution – Amirshk

+0

dois-je écrire quelque chose dans la propriété FormCRef ou devrait laisser le chemin comme vous l'avez écrit ??? désolé de poser une telle question simple mais je n'ai jamais créé aucune propriété avant donc ne sais pas beaucoup à leur sujet. –

+0

@Pratik Gandhi - la syntaxe que j'ai utilisée est très bien. Il s'appelle Automatic Properties et a été introduit en C# 3.0. – Oded

1

Vous devez utiliser les instances créées dans FormA, car tous les formulaires ce reperesnt une forme différente.

La bonne façon de le faire est d'exposer un FormB d'événements, ont FormA Inscrivez-vous pour, puis FormA peut appeler ce que vous voulez sur 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 : // Enregistrer les instances de formulaire pour une utilisation future, en tant que membres privés de la classe 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

Une alternative, (et peut-être l'option controversée) est d'avoir la référence à chaque forme stockée comme une variable statique dans chaque forme. Si vous ne voulez qu'une instance de ce formulaire à un moment donné, alors cette méthode devrait être bonne.Il est connu comme un Singleton pattern.

En forme C ont les éléments suivants:

private static FormC thisForm = null; 

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

    return thisForm; 
} 

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

Dans la formule A, si vous devez faire tout mis en place sur appel Formulaire C:

FormC.GetFormC().mdiParent = this; 

Et puis dans le formulaire B, pour afficher le formulaire C, appelez l'appel suivant:

FormC.ShowFormC(); 

Son propre, clair, et si vous êtes Absolument sûr que vous ne voudrez jamais qu'une instance de FormC (ce que votre code semble faire de toute façon), alors c'est logique!

0

Pour réduire le couplage, la meilleure pratique consiste à utiliser le modèle MessageBroker/EventBroker/EventAggregator. Vous cand trouverez une implémentation here ou here

Utilisation:

Déclarez la classe d'événement:

public class ShowFormCEvent {} 

Subcribe à l'événement en FormA:

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

incendie l'événement en FormB

EventPublisher.Publish(new ShowFormCEvent()); 
0

Cela dépend de la nature de votre conception:

S'il est logique pour FormB de parler à FormC directement, puis FormB a besoin d'une référence à FormC. Dans ce cas, je pense que FormC ne devrait peut-être pas être lié à FormA, et qu'à la place FormB devrait gérer FormC. (Comme si FormC était une fenêtre d'outil de FormB). Si cela n'a pas de sens que FormB parle directement à FormC, alors FormB devrait «envoyer un message» (appeler une méthode) jusqu'à FormA, et FormA devrait envoyer le message à FormC. ex:

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

En FormA (MDIForm):

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

En FormB:

FormC formC = new FormC(); 
formC.MdiParent = (FormA)this.ParentForm; 
formC.Show(); 
this.Close(); 
Questions connexes