2010-10-01 3 views
3

J'ai un projet qui a une interface utilisateur composée de deux panneaux (gauche & à droite).Treeview pour contrôler les panneaux

Dans le panneau de gauche se trouve une vue arborescente. Selon le noeud sélectionné, un "formulaire" différent est requis dans le panneau de droite. Jusqu'à présent, j'ai défini un ensemble de "contrôles utilisateur" différents pour le panneau de droite et je les ai créés et montrés comme requis par le bon noeud sélectionné dans l'arborescence.

Existe-t-il un "modèle" pour gérer ce type de processus car mon code (trop long à inclure ici) est très fragile et pas du tout extensible. N'importe qui a eu des suggestions ou même savoir d'un projet open source qui réalise le même genre de chose.

+0

duplication possible de [Meilleure méthode de création d'une interface de type "dialogue de préférences d'arborescence" en C#?] (Http://stackoverflow.com/questions/3725/best-method-for-creating-a-tree -view-preferences-type-de-dialogue-de-interface-en-c) – xyz

+0

Ma réponse à la question ci-dessus fonctionne, mais il y a peut-être un patten supérieur ou plus accepté! – xyz

Répondre

5

Cela ne doit pas être difficile. Ancrez un TreeView sur la gauche, ajoutez un panneau et définissez Dock to Fill. Utilisez ensuite un code comme celui-ci pour sélectionner un contrôle utilisateur:

private UserControl currentView; 

    public void SelectView(UserControl ctl) { 
     if (currentView != null) { 
      panel1.Controls.Remove(currentView); 
      currentView.Dispose(); 
     } 
     if (ctl != null) { 
      ctl.Dock = DockStyle.Fill; 
      panel1.Controls.Add(ctl); 
     } 
     currentView = ctl; 
    } 

Vous pouvez obtenir des détails sur le TreeView en utilisant la réflexion. Dans le concepteur, définissez la propriété Name du noeud sur le nom du contrôle utilisateur (comme "UserControl1"). Et implémentez l'événement BeforeSelect similaire à celui-ci:

private void treeView1_BeforeSelect(object sender, TreeViewCancelEventArgs e) { 
     string name = e.Node.Name; 
     name = this.GetType().Namespace + "." + name; 
     Type ctlType = System.Reflection.Assembly.GetExecutingAssembly().GetType(name); 
     if (ctlType == null) e.Cancel = true; 
     else { 
      var ctor = ctlType.GetConstructor(new Type[] { }); 
      var ctl = ctor.Invoke(null) as UserControl; 
      SelectView(ctl); 
     } 
    } 

C'est tout. Modifiez le code ci-dessus si les contrôles utilisateur se trouvent dans un espace de noms différent ou dans un assembly différent.

+0

+1: Plutôt que d'utiliser la propriété 'Name' et la réflexion, que diriez-vous de définir la propriété' Tag' sur un 'Func '? –

+0

@Alex: oui, il y a beaucoup de chemin à faire. J'essayais d'éviter le code standard dont vous auriez besoin pour tout initialiser. –

Questions connexes