web-dev-qa-db-fra.com

Panel.Dock Fill en ignorant tout autre paramètre Panel.Dock

Si vous créez un panneau sur un formulaire et que vous le définissez sur Dock = Top, déposez un autre panneau et définissez son Dock = Remplir, il peut remplir le formulaire en entier, en ignorant le premier panneau. Changer l'ordre de tabulation ne fait rien.

134
Jeff Cuscutis

La disposition d'ancrage dépend de l'ordre des commandes parent. Les contrôles sont ancrés «bouton en place», ainsi le dernier contrôle de la collection est ancré en premier. Un contrôle ancré ne prend en compte que la présentation de précédemment frères ancrés. Par conséquent, le contrôle avec Dock = Fill doit être en premier (en haut) dans l’ordre des frères et sœurs, si vous souhaitez que les autres contrôles ancrés soient pris en compte. Si ce n'est pas le premier contrôle, les contrôles précédents le chevaucheront.

Cela peut être déroutant, car l’ordre des frères et sœurs n’est pas nécessairement le même que l’ordre visuel et que l’ordre des frères et sœurs n’est pas toujours apparent du point de vue de la conception. 

La fenêtre Aperçu du document (Affichage -> Autres fenêtres -> Aperçu du document) fournit une vue arborescente utile sur la hiérarchie et l’ordre des contrôles et vous permet de modifier l’ordre des contrôles.

Vous pouvez également modifier l'ordre des frères directement dans le concepteur par le menu contextuel -> Mettre au premier plan/Envoyer au dos, ce qui déplace le contrôle pour qu'il soit le premier ou le dernier des frères et sœurs. Ces étiquettes de menu peuvent être quelque peu déroutantes car l’effet réel dépend du modèle de disposition.

Avec les contrôles positionnés fixes, la position 2D est indépendante de l'ordre des frères et soeurs, mais lorsque les contrôles se chevauchent, le contrôle le plus ancien dans l'ordre sera "au-dessus", masquant une partie des frères et sœurs plus tard dans l'ordre. Dans ce contexte, mettre au premier plan/mettre à fond a du sens.

Dans les panneaux d'agencement de flux ou de tableaux, l'ordre de création détermine l'ordre visuel des contrôles. Il n'y a pas de contrôles qui se chevauchent. Donc, mettre en avant/envoyer en arrière signifie vraiment faire en premier ou en dernier dans l’ordre des contrôles.

Avec une disposition ancrée, les options mettre en avant/envoyer en arrière peuvent être encore plus déroutantes, car elles déterminent l'ordre dans lequel l'ancrage est calculé. Par conséquent, "mettre en avant" sur un contrôle fill-docked le placera dans le milieu du parent, en prenant en compte tous les contrôles ancrés dans Edge.

297
JacquesB

Cliquez avec le bouton droit sur le panneau avec Dock = Remplir et cliquez sur 'Mettre au premier plan'. 

Ce contrôle est donc créé en dernier, ce qui prend en compte les paramètres du Dock des autres contrôles du même conteneur.

97
Jeff Cuscutis

Une autre option potentiellement plus propre consiste à utiliser le contrôle TableLayout. Configurez une rangée de la hauteur souhaitée pour votre quai supérieur et une autre rangée pour remplir à 100% votre fond. Réglez les deux panneaux à l'intérieur sur Remplir et vous avez terminé.

(TableLayout prend un peu de temps pour s'y habituer.)

7
John Rudy

J'ai eu le même problème et j'ai réussi à le résoudre.
Si vous avez un conteneur avec DockStyle.Fill, les autres doivent également avoir DockStyle mais Top ou ce que vous voulez.
L’important est d’ajouter le contrôle avec DockStyle.Fill d’abord dans Contrôles puis dans les autres.

Exemple:

ComboBox cb = new ComboBox();
cb.Dock =  DockStyle.Top;

GridView gv = new GridView();
gv.Dock =  DockStyle.Fill;

Controls.Add(gv); // this is okay
Controls.Add(cb);

mais si on met cb en premier

Controls.Add(cb);
Controls.Add(gv); // gv will overlap the combo box.
6

Si vous ne souhaitez pas modifier l'ordre des éléments dans le code, vous pouvez utiliser la méthode Container.Controls.SetChildIndex (), Container étant par ex. Formulaire, panneau, etc. auquel vous souhaitez ajouter vos contrôles.

Exemple:

     //Container ------------------------------------
     Panel Container = new Panel();

     //Top-Docked Element ---------------------------
     ButtonArea = new FlowLayoutPanel();
     Container.Controls.Add(ButtonArea);
     Container.Controls.SetChildIndex(ButtonArea, 1);
     ButtonArea.Dock = DockStyle.Top;

     //Fill-Docked Element --------------------------
     box = new RichTextBox();
     Container.Controls.Add(box);
     Container.Controls.SetChildIndex(box, 0); //setting this to 0 does the trick
     box.Dock = DockStyle.Fill;
1
Marcus

JacquesB en avait eu l'idée avec le plan du document mais la hiérarchie n'a pas résolu mon problème ..__ Mes contrôles n'étaient pas dans un style hiérarchique, ils étaient simplement listés avec le même parent.

J'ai appris que si vous changiez l'ordre, cela corrigera votre apparence.

Les contrôles au bas de la liste chevaucheront les contrôles au-dessus dans la fenêtre Structure du document. Dans votre cas, vous devez vous assurer que le premier panneau est en dessous du second, etc.

1
RANONO

J'ai rencontré le même problème. Le mien consistait à ajouter de nouveaux contrôles/contrôles personnalisés sous la bande de menus pendant l'exécution. Le problème était que les commandes étaient ancrées, décidées à s’ancrer du haut du formulaire et en ignorant complètement la barre de menus, très gênant si vous me le demandiez ... est devenu extrêmement frustrant. Le moyen le plus simple que j'ai trouvé est de créer un panneau en mode conception et de le placer sous la barre de menus. A partir de là, vous pouvez simplement ajouter/supprimer les contrôles au panneau et vous pouvez l'ancrer pendant l'exécution. Nul besoin de jouer avec tous vos contrôles sur votre formulaire qui ne nécessitent pas vraiment de modification, mais vous avez trop de travail en fonction de ce que vous devez réellement faire.

object.dock = Fill
Panel.Controls.Add(object)
0
Robert S.

Voici un truc qui a fonctionné pour moi ..

Placez l’élément supérieur et amarrez-le en haut.

Placez un séparateur, puis fixez-le en haut, puis désactivez-le (sauf si vous souhaitez redimensionner le haut).

Ensuite, placez l'objet Remplissage et définissez Docking sur Remplir. L'objet restera en dessous du séparateur.

0
John Christman

Je sais que c'est un ancien post mais j'ai découvert quelque chose d'utile. Pour ajuster l'ordre des contrôles frères par programmation pour des contrôles créés dynamiquement, vous pouvez effectuer les opérations suivantes:

parentForm.Controls.SetChildIndex (myPanel, 0) 

Dans mon cas, j’ai fait cela pour déplacer un panneau Dock/Fill en tant que premier contrôle de ma fiche afin qu’il ne chevauche pas un autre contrôle ancré défini sur Dock/Top (une barre de menu).

0
DrLechter