Question

J'ai une sorte d'arborescence qui représente une hiérarchie de couches dans une carte, divisée par types de couches et de catégories. Chaque nœud peut être une classe différente pour différents types de couches (mais tous les nœuds implémentent une interface commune).

Je dois convertir cette classe en un contrôle ASP.NET TreeView. Chaque nœud de l'arborescence d'entrée est un nœud de l'arborescence de sortie, avec des propriétés définies qui dépendent du type du nœud. Je ne veux pas que les classes de l'arborescence d'entrée connaissent les classes de l'interface utilisateur. Je ne peux donc pas écrire de "ToTreeViewNode ()". méthode en eux. Il existe actuellement 4 types de classes de nœuds concrets, 2 d’entre elles sont composites (contiennent des nœuds enfants) et 2 d’entre elles sont des feuilles. Cela pourrait changer à l'avenir.

On dirait qu'il y a un motif de conception ici qui pique, mais pouvez-vous m'aider à trouver ce que c'est?

Était-ce utile?

La solution

Un Visiteur peut-être, pour consulter l’arborescence de saisie et créer l’arborescence de l’interface utilisateur correspondante?

Autres conseils

Mon .NET est un peu rouillé, mais vous pouvez créer une sous-classe distincte de TreeNodeCollection et éventuellement TreeNode, en leur donnant accès à votre structure et en lui affectant votre TreeNodeCollection aux nœuds le TreeViewControl.

Le wrapper TreeNodeCollection convertira votre structure en une structure TreeViewControl. La classe TreeNode contiendra probablement une référence à vos propres nœuds, mais convertira vos nœuds en TreeNodes.

En d'autres termes, en implémentant ces deux interfaces, vous adaptez l'interface de votre modèle à celle utilisée par TreeViewControl,

.

Si vous utilisez le modèle Visiteur pour créer une structure parallèle, vous devez l'exécuter à chaque changement. Sinon, vous devrez toujours envelopper votre noeud avec l'interface TreeNode.

Voir Modèle d'adaptateur

Je ne suis pas sûr de ce que vous essayez d'atteindre, mais (si j'ai bien compris), je pense que si vous allez utiliser les deux:

  1. Composite - pour les nœuds (arbre)
  2. Stratégie - pour la mise en oeuvre du dessin "algotithme"

vous aurez donc:

public class Node
{
   public IDraw genericDrawing;
   public Node[] Childs;
   public Node() { //init you genericDrawinf }
   public void Draw() 
   {
      genericDrawing.Draw(this);
      foreach (Node child in Childs)
      {
         child.Draw();
      }
   }
}

public interface IDraw
{
    void Draw(Node node);
}
public class SimpleDraw : IDraw
{
    public void Draw(Node node)
    {
       // code your stuf in here.
    }
}

la grande chose est:

  1. vous n'avez pas besoin de dessin récursif, chacun tirant lui-même
  2. votre stratégie de dessin peut changer pendant l'exécution ou pendant l'instance d'un objet
  3. vous pouvez mettre à l'échelle chacune de vos hiérarchies de classes sans dépendance dans l'autre structure.
  4. pensez-y comme les contrôles de vos formulaires Web
  5. De plus, chaque objet est un principe de responsabilité unique (SRP)

Profitez.

Il me semble que vous souhaitez utiliser Model-View-Controller ici. Votre structure d'arborescence correspond probablement au modèle, tandis que la vue correspond au contrôle TreeView. Vous devrez probablement ajouter une classe de contrôleurs pour gérer les interactions entre les deux.

J'espère avoir bien répondu à votre question:

Extrait de "O'Reilly - Conception de modèles d'interfaces pour une conception d'itération efficace"

Vous avez ces deux modèles généralement associés aux arbres:

  • "Listes en cascade"
  • "Treemap"

Le chapitre 6 de ce livre contient environ douze modèles de motifs de conception à utiliser pour afficher des données complexes.

Je n’ai trouvé aucun lien vers ces modèles, je suppose que vous devrez vérifier le livre à la bibliothèque locale. J'ai trouvé cette page Web qui pourrait vous aider, mais j'ai vérifié et elle n'inclut pas les deux, ni celles du chapitre 6. http://www.welie.com/patterns/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top