2009-12-30 5 views
0

J'ai trois formes nommées frmBase (form1), frmGraph (form2) et frmBalloon (form3). FrmGraph (form2) s'ouvre si l'utilisateur clique sur le bouton btnShow placé sur frmBase (form1). FrmBalloon (form3) s'ouvre si l'utilisateur clique sur le bouton btnShow placé sur frmGraph (form2). Maintenant, si l'utilisateur clique sur le bouton nommé btnCancel placé sur le frmGraph (form2) OU clique sur le bouton nommé btnCancel placé sur le frmBalloon (form3), tous les formulaires ouverts doivent être fermés à l'exception de frmBase (form1). Par conséquent, tous les formulaires doivent être fermés à l'exception de la forme principale lorsque l'utilisateur clique sur le bouton placé sur le formulaire2 ou sur le formulaire3. Donc, pour cela, y a-t-il une solution?tous les formulaires doivent être fermés mais pas la forme principale

+1

Tout ce que je peux voir, c'est que vous avez beaucoup de formes et de boutons! –

+0

Non il n'y a que trois formes et six boutons – Harikrishna

Répondre

1

Il n'est pas une excellente solution, Application.OpenForms est un peu fiable, mais facile: modèle

public static void CloseAllFormsButMain() { 
    for (int ix = Application.OpenForms.Count - 1; ix > 0; --ix) 
    Application.OpenForms[ix].Close(); 
} 
+0

Merci beaucoup .. Il fonctionne très bien ....... grand .. – Harikrishna

+0

Y at-il un code comme, frmBallloon est montré dans l'événement de clic btnShow de la frmBase et encore je veux montrer frmBase si l'utilisateur clique sur le btnShow de la frmBalloon puis il ya deux copie de la frmBase.Je ne veux qu'une seule copie.Puis comment puis-je modifier la vue du formulaire en cliquant sur le bouton. – Harikrishna

+0

Je ne peux pas répondre à une question dans une boîte de commentaires. Commencez un nouveau sujet avec cette question. –

2

Conserve les références de tous les objets de formulaire devant être fermés sur l'événement désigné. Créez et appelez la fonction dans frmBase chaque fois que nécessaire. La fonction sera responsable de fermer tous les formulaires enregistrés si elle est ouverte.

Cela ressemble à un cas observer pattern.

+0

Je veux fermer tous les formulaires mais la forme principale. – Harikrishna

+0

Enregistrez donc les références de seulement les formulaires qui doivent être fermés. –

+0

Comment puis-je enregistrer les références des formulaires ?? – Harikrishna

1

Observer est approprié avec certains specializaiton. Une version plus spécialisée du modèle d'observateur pour ce type de scénario est le modèle EventAggregator. Le modèle d'agrégateur d'événements est idéal pour ce type de scénario.

En bref, l'agrégateur d'événements vous permet de centraliser la publication/abonnement d'événements. Par conséquent, tous les abonnés et les éditeurs ne parlent que de l'EventAggregator. Les abonnés s'abonnent aux événements et les éditeurs commandent l'agrégateur d'événements pour publier quelque chose.

Le modèle d'agrégateur d'événements découple également chaque abonné d'éditeur l'un par rapport à l'autre. Cela élimine le besoin pour les formulaires enfants de référencer les formulaires parents. Jeremy Miller fournit un bon exemple dans sa série Build Your Own Cab. En raison de ma nouvelle adhésion, je ne peux pas poster les liens vers les sites, mais juste faire une recherche pour les éléments suivants.

EventAggregator par Martin Fowler construire votre propre série CAB par Jeremy Miller (codebetter.com) EventAggregator dans PRISM

Voici un exemple simple que je cuisinais à l'aide de C# et génériques. Ce n'est en aucun cas complet. C'est juste pour illustrer un exemple simplifié. Pour un modèle plus complet, passez à l'exemple de Jeremy Millers.

[code]

// Exemples args événement personnalisé using System;

espace de noms EventAggregatorPatternDemo { CloseAllFormsEventArgs public class: EventArgs { }}

// Formulaire Exemple de code using System; en utilisant System.Collections.Generic; en utilisant System.ComponentModel; en utilisant System.Data; à l'aide de System.Drawing; en utilisant System.Linq; en utilisant System.Text; en utilisant System.Windows.Forms;

espace de noms EventAggregatorPatternDemo { public partial class GraphForm: Formulaire, IListener { GraphForm public() { InitializeComponent(); }

private void GraphForm_Load(object sender, EventArgs e) 
    { 
     EventAggregator.GetTheEventAggregator().Subscribe<CloseAllFormsEventArgs>(this); 
    } 

    public void Handle<TEventArgs>(TEventArgs e) 
    { 
     if (e.GetType() == typeof(CloseAllFormsEventArgs)) 
     { 
      this.Close(); 
     } 
    } 

    private void btnCloseAll_Click(object sender, EventArgs e) 
    { 
     EventAggregator.GetTheEventAggregator().Publish(this, new CloseAllFormsEventArgs()); 
    } 

    private void GraphForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     EventAggregator.GetTheEventAggregator().CancelSubscription<CloseAllFormsEventArgs>(this); 
    } 
} 

}

// événement Code Aggregator using System; en utilisant System.Collections.Generic;

espace de noms EventAggregatorPatternDemo { interface publique IListener { poignée vide (TEventArgs e); }

public class EventAggregator 
{ 
    static EventAggregator _TheEventAggregator; 

    readonly Dictionary<Type, List<IListener>> _listeners; 

    private EventAggregator() 
    { 
     _listeners = new Dictionary<Type, List<IListener>>(); 
    } 

    public static EventAggregator GetTheEventAggregator() 
    { 
     if(_TheEventAggregator == null) 
     { 
      _TheEventAggregator = new EventAggregator(); 
     } 

     return _TheEventAggregator; 
    } 

    public void Publish<TEventArgs>(object sender, TEventArgs e) 
    { 
     if(_listeners.ContainsKey(e.GetType())) 
     { 
      var listOfSubscribers = _listeners[e.GetType()]; 

      for(int i = listOfSubscribers.Count - 1; i > -1; i--) 
      { 
       listOfSubscribers[i].Handle(e); 
      } 
     } 
    } 

    public void Subscribe<TEventArgs>(IListener listener) 
    { 
     if(_listeners.ContainsKey(typeof(TEventArgs))) 
     { 
      _listeners[typeof(TEventArgs)].Add(listener); 
     } 
     else 
     { 
      List<IListener> newListenerList = new List<IListener>(); 
      newListenerList.Add(listener); 

      _listeners.Add(typeof(TEventArgs), newListenerList); 
     } 
    } 

    //Cancels all subscriptions 
    public void CancelSubscription<TEventArgs>(IListener listener) 
    { 
     Type eventArgsType = typeof(TEventArgs); 

     if (_listeners.ContainsKey(eventArgsType)) 
     { 
      //Remove from the end 
      for (int i = _listeners[eventArgsType].Count-1; i > -1; i--) 
      { 
       //If the objects are the same 
       if(ReferenceEquals(_listeners[eventArgsType][i], listener)) 
       { 
        _listeners[eventArgsType].RemoveAt(i); 
       } 
      } 
     } 
    } 
} 

} [/ code]

0

Avez-vous pensé à utiliser un événement statique? Here est un exemple simple.

Questions connexes