2008-12-23 7 views

Répondre

11

Si vous voulez une liste des formulaires ouverts, c'est Application.OpenForms. Vous pouvez itérer sur ceci, en utilisant GetType() et en vérifiant le .Assembly pour trouver ceux d'un assemblage différent. Au-delà de cela, je ne suis pas clair sur toute la question ...

 Assembly currentAssembly = Assembly.GetExecutingAssembly(); 
     List<Form> formsFromOtherAssemblies = new List<Form>(); 
     foreach (Form form in Application.OpenForms) { 
      if (form.GetType().Assembly != currentAssembly) { 
       formsFromOtherAssemblies.Add(form); 
      } 
     } 

Si vous voulez juste suivre les formes que vous avez ouvert vous-même, cache alors cette instance. Ou si vous utilisez des "formulaires possédés", vous pouvez simplement vérifier par le nom:

private void button1_Click(object sender, EventArgs e) { 
     foreach (Form form in OwnedForms) { 
      if (form.Name == "Whatever") { 
       form.Activate(); 
       return; 
      } 
     } 
     Form child = new Form(); 
     child.Name = "Whatever"; 
     child.Owner = this; 
     child.Show(this); 
    } 
+0

D'abord, Merci pour votre réponse. En référence à votre premier extrait de code. Le problème est Application.OpenForms (n'a pas les formulaires sont affichés, il est juste un chargeur) et bien Assembly currentAssembly = Assembly.GetExecutingAssembly(); semble prometteur ... le code doit être inversé..mmmm – abmv

+0

Application.OpenForms renverra 0 c'est-à-dire qu'il est loader – abmv

+1

Je ne sais pas pourquoi votre formulaire principal étant juste un chargeur devrait affecter le résultat ici ... si le runtime connaît le formulaire, il devrait apparaître dans Application.OpenForms - sauf si vous voulez dire qu'il s'exécute dans un autre processus * - est-ce le cas? –

0

Vous pouvez utiliser un modèle de commande. L'assemblage du chargeur recherchera les commandes dans les assemblys chargés. Pour chaque commande, le chargeur crée un élément de menu (ou toute autre chose, vous voulez), et l'événement click lancera la commande concrète.

La commande doit savoir si le nouveau formulaire doit être créé ou s'il doit déjà être utilisé.

+0

c'est exactement la question – abmv

2
NewProduct newproduct; 
    private void button1_Click(object sender, EventArgs e) 
    { 

     if(!isOpened()) 
     { 
      newproduct = new NewProduct(); 
      newproduct.Show(); 
     } 

    } 
    private bool isOpened() 
    { 
     foreach (Form f in Application.OpenForms) 
     { 
      if (f == newproduct) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 
+0

S'il vous plaît créer une application WPF, et essayez ceci.J'ai juste essayé cela ne fonctionnait pas. – abmv

0

La réponse de Mark Garvell m'a aidé à comprendre ce que je devais faire, mais il fallait ajuster pour WPF.

(Dans mon cas, je voulais fermer toutes les fenêtres ne lui appartenant pas le principal quand il se ferme, mais le principe est le même.)

private void EmployeeMenuItemClick(object sender, RoutedEventArgs e) 
{ 
    bool found = false; 
    foreach(Window w in Application.Current.Windows) 
    { 
     if(w.GetType() == typeof(EmployeeListViewWindow) 
     { 
      found = true; 
      break; 
     } 
    } 
    if(!found) 
    { 
     EmployeeListViewWindow ew = new EmployeeListViewWindow(); 
     ew.Show(); 
    } 
} 
+0

pourrait-il être ajusté? – abmv

+0

Pourrait être ajusté? La nouvelle fenêtre/actuelle? Oui, il suffit de définir ses propriétés. –

+0

désolé je voulais wpf? – abmv

2

Un autre exemple simple

private Boolean FindForm(String formName) 
    { 
     foreach (Form f in Application.OpenForms) 
     { 
      if (f.Name.Equals(formName)) 
      { 

       f.Location = new Point(POINT.X, POINT.Y + 22); 
       return true; 
      } 
     } 

     return false; 
    } 
Questions connexes