How to create a tree- afficher le dialogue de préférences type d'interface en C #?

Translate

J'écris une application qui est essentiellement une boîte de dialogue de préférences, un peu comme la boîte de dialogue des préférences de l'arborescence que Visual Studio lui-même utilise. La fonction de l'application est simplement un transfert des données d'un périphérique série vers un fichier. Il effectue de très nombreuses transformations sur les données avant de les écrire dans le fichier, de sorte que l'interface graphique de l'application comprend simplement tous les paramètres qui dictent ce que ces transformations devraient être.

Quelle est la meilleure façon de concevoir / coder une boîte de dialogue de préférences d'arborescence? La façon dont j'ai procédé consiste à construire la fenêtre principale avec un contrôle d'arborescence ancré sur la gauche. Ensuite, j'ai créé des contrôles de conteneur qui correspondent à chaque nœud de l'arborescence. Lorsqu'un nœud est sélectionné, l'application place le contrôle conteneur correspondant de ce nœud au premier plan, le déplace vers la bonne position et l'agrandit dans la fenêtre principale. Cela semble vraiment, vraiment maladroit lors de sa conception. Cela signifie essentiellement que j'ai des tonnes de contrôles de conteneurs au-delà du bord de la fenêtre principale pendant la conception que je dois continuer à faire défiler la fenêtre principale afin de travailler avec eux. Je ne sais pas si cela a tout à fait un sens dans la façon dont j'écris ceci, mais peut-être que ce visuel pour ce dont je parle aura plus de sens:

form design

Fondamentalement, je dois travailler avec ce formulaire énorme, avec des contrôles de conteneurs partout, puis faire un tas de reformatage à l'exécution pour que tout fonctionne. Cela ressemble à unlotde travail supplémentaire. Est-ce que je fais ça d'une manière totalement stupide? Y a-t-il un moyen "évident" plus simple de faire cela qui me manque?

This question and all comments follow the "Attribution Required."

Toutes les réponses

xyz
Translate

Une manière plus ordonnée est de créer des formulaires séparés pour chaque `` volet '' et, dans chaque constructeur de formulaire, de définir

this.TopLevel = false;
this.FormBorderStyle = FormBorderStyle.None;
this.Dock = DockStyle.Fill;

De cette façon, chacun de ces formulaires peut être mis en page dans son propre concepteur, instancié une ou plusieurs fois au moment de l'exécution et ajouté à la zone vide comme un contrôle normal.

Peut-être que le formulaire principal pourrait utiliser unSplitContaineravec un statiqueTreeViewdans un panneau, et de l'espace pour ajouter ces formulaires dans l'autre. Une fois qu'ils sont ajoutés, ils peuvent être retournés en utilisantHide/ShowouBringToFront/SendToBackméthodes.

SeparateForm f = new SeparateForm(); 
MainFormSplitContainer.Panel2.Controls.Add(f); 
f.Show();
La source
Translate

Greg Hurlman a écrit:

Pourquoi ne pas simplement afficher / masquer le conteneur approprié lorsqu'un nœud est sélectionné dans la grille? Faites en sorte que les conteneurs soient tous dimensionnés de manière appropriée au même endroit et masquez tous sauf celui par défaut, qui serait présélectionné dans la grille lors du chargement.

Malheureusement, c'est ce que j'essaie d'éviter. Je recherche un moyen simple de gérer l'interface pendant la conception, avec un minimum de code de reformatage nécessaire pour la faire fonctionner pendant l'exécution.

J'aime la réponse de Duncan car cela signifie que la conception de l'interface de chaque nœud peut être conservéecomplètementséparé. Cela signifie que je n'obtiens pas de chevauchement sur les directives de capture et d'autres avantages de conception.

La source
Translate

Je créerais probablement plusieurs classes de panneaux basées sur une classe de base héritant de CustomControl. Ces contrôles auraient alors des méthodes comme Save / Load et des trucs comme ça. Si tel est le cas, je peux concevoir chacun de ces panneaux séparément.

J'ai utilisé un contrôle Wizard qui, en mode conception, traitait plusieurs pages, de sorte que l'on puisse cliquer sur suivant dans le concepteur et concevoir toutes les pages à la fois via le concepteur. Bien que cela présente plusieurs inconvénients lors de la connexion du code aux contrôles, cela signifie probablement que vous pourriez avoir une configuration similaire en créant des classes de concepteur. Je n'ai jamais moi-même écrit de classes de concepteur dans VS, donc je ne peux pas dire comment ou si cela en vaut la peine :-)

Je suis un peu curieux de savoir comment vous comptez gérer le chargement / enregistrement des valeurs vers / depuis les commandes? Il doit y avoir beaucoup de code dans une classe si toutes vos pages sont dans un seul grand formulaire?

Et encore une autre façon serait bien sûr de générer le code d'interface graphique lorsque chaque page est demandée, en utilisant des informations sur le type de paramètres existants.

La source