2010-07-21 26 views
2

Jusqu'ici dans ma vie, en tant que développeur .net, j'ai beaucoup utilisé les formes mdi pour afficher des "points de menu" particuliers comme par exemple "module 1" "module 2" et ainsi sur.C# menu principal et formes mdi

Je fais ce de la manière suivante:

  • créer un formulaire parent « IsMdiContainer » à « true »
  • créer une bande de menu dans le conteneur IMD
  • créer un enfant forme mise en œuvre singleton pour que la forme à afficher une seule fois
  • Ajouter quelque chose comme le code suivant au conteneur IMD:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace Myapp 
{ 

public partial class MdiContainer : Form 
{ 
    private module1 Module1Window; 
    private module2 Module2Window; 
    private module3 Module3Window; 

    public FormContainer() 
    { 
     InitializeComponent(); 
     this.Module1Window = modul1.getInstance(); 
     this.Module1Window.MdiParent = this; 
     this.Module2Window = modul2.getInstance(); 
     this.Module2Window.MdiParent = this; 
     this.Module3Window = modul3.getInstance(); 
     this.Module3Window.MdiParent = this; 
     this.Module1Window.Show(); 
    } 
    private void module1ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     this.Module3Window.Hide(); 
     this.Module2Window.Hide(); 
     this.Module1Window.Show(); 
    }  
    private void module2ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     this.Module1Window.Hide(); 
     this.Module3Window.Hide(); 
     this.Module2Window.Show(); 
    } 
    private void module3ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     this.Module1Window.Hide(); 
     this.Module2Window.Hide(); 
     this.Module3Window.Show(); 
    } 
} 

}

Maintenant, cela fonctionne évidemment très bien. Mais c'est une douleur à maintenir. Chaque fois que je veux ajouter une autre forme d'enfant, je dois:

  • mettre en œuvre Singleton
  • créer la propriété correspondante dans le conteneur IMD
  • obtenir l'instance et définissez le parent IMD
  • Masquer la nouvelle forme lorsque d'autres boutons sont cliqués
  • afficher le formulaire et cacher toutes les autres formes lorsque le bouton correspondant est cliqué

Ce qui est une approche plus élégante ou laisse dire efficace pour archiver cela?

+0

Si j'ai bien compris: vous utilisez des MDI pour gérer différents formulaires - mais en affichant uniquement un formulaire à la fois. Pourquoi? –

+0

Je ne pense pas que cela va compiler. Est-ce MdiContainer ou FormContainer? –

Répondre

1

Quand créez-vous les éléments de menu? Sont-ils créés dynamiquement avec les formes enfants? Si oui, ce que vous pouvez faire est de créer le formulaire et l'ajouter à une liste et affecter la propriété Tag de l'élément de menu au formulaire. Attribuer tous les éléments de menu, cliquez sur événement pour le même gestionnaire et dans le gestionnaire faire ceci ...

private void menuStrip_Click(object sender, EventArgs e) 
{ 
    var menu = (ToolStripItem)sender; 
    var viewForm = (Form)sender.Tag; 
    foreach(Form childForm in _childForms) 
     childForm.Hide(); 
    viewForm.Show(); 
} 

Ce même gestionnaire peut être utilisé peu importe combien de formes que vous avez.

Vous pouvez également avoir une clé en tant que balise et avoir un Dictionary<string, Form> de sorte que vous puissiez créer plus paresseusement les formulaires, mais le concept est le même.

Questions connexes