Panel.Dock Fill ignorant les autres parameters Panel.Dock

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

La disposition de la station d’accueil dépend de l’ ordre des contrôles frères. Les contrôles sont ancrés “bouton vers le haut”, de sorte que le dernier contrôle de la collection est ancré en premier. Un contrôle ancré ne prend en compte que la disposition des frères et sœurs précédemment ancrés. Par conséquent, le contrôle avec Dock = Fill doit être le premier (en haut) dans l’ordre frère si vous souhaitez qu’il prenne en compte les autres contrôles ancrés. Si ce n’est pas le premier contrôle, les contrôles antérieurs le chevaucheront.

Cela peut être déroutant car l’ordre des frères et soeurs n’est pas nécessairement le même que l’ordre visuel et l’ordre des frères n’est pas toujours visible dans la vue de conception.

La fenêtre Plan du document (Affichage -> Autres fenêtres -> Plan du document) donne une vue arborescente utile au-dessus de la hiérarchie et de l’ordre des contrôles et vous permet de modifier l’ordre des frères.

Vous pouvez également modifier directement l’ordre frère dans le menu contextuel du concepteur -> Mettre au premier plan / Envoyer à l’arrière, ce qui déplace le contrôle en premier ou en dernier. Ces étiquettes de menu peuvent être quelque peu déroutantes car l’effet réel dépend du modèle de présentation.

Avec les commandes fixes, la position 2D est indépendante de l’ordre des frères, mais lorsque les contrôles se chevauchent, le contrôle le plus ancien dans l’ordre sera “au-dessus”, cachant une partie des frères plus tard dans la commande. Dans ce contexte, mettre au premier plan / Envoyer à l’arrière a du sens.

Dans les panneaux de présentation de stream ou de table, 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 à l’avant / envoyer à l’arrière signifie vraiment faire le premier ou le dernier dans l’ordre des contrôles.

Avec la disposition ancrée, la mise au premier plan / l’envoi vers l’arrière peut être encore plus confuse car elle détermine dans quel ordre l’amarrage est calculé. Par conséquent, un contrôle placé à quai place le contrôle au milieu du parent. , en prenant en compte tous les contrôles à quai.

Cliquez avec le bouton droit sur le panneau avec Dock = Fill et cliquez sur “Bring to Front”.

Cela permet de créer ce contrôle en dernier, qui prend en compte les parameters du Dock sur les autres contrôles du même conteneur.

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 pour remplir 100% de votre fond. Placez les deux panneaux à l’intérieur pour remplir, et vous avez terminé.

(Il faut toutefois s’habituer à TableLayout.)

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 devraient également avoir DockStyle mais Top ou ce que vous voulez.
L’important est d’append le contrôle avec DockStyle.Fill abord dans Controls puis 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. 

JacquesB a eu l’idée avec les grandes lignes 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 venaient d’être répertoriés avec le même parent.

J’ai appris que si vous modifiiez l’ordre, il réparera comme vous le souhaitez.

Les commandes situées en bas de la liste chevauchent les commandes situées en haut de la fenêtre Structure du document. Dans votre cas, vous vous assureriez que le premier panneau est en dessous du deuxième panneau et ainsi de suite.

Voici un truc qui a fonctionné pour moi ..

Placez le top item et placez-le en haut.

Placez un répartiteur, puis fixez-le sur le dessus, puis désactivez-le (sauf si vous souhaitez redimensionner le haut).

Ensuite, placez l’object Remplir et définissez l’option Ancrage sur Remplir. L’object restra sous le séparateur.

Si vous ne souhaitez pas modifier l’ordre des éléments à l’intérieur du code, vous pouvez utiliser la méthode Container.Controls.SetChildIndex () avec le conteneur, par exemple, le formulaire, le panneau, etc. auquel vous souhaitez append 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 sortingck box.Dock = DockStyle.Fill; 

J’ai rencontré le même problème. Le mien était avec l’ajout de contrôles nouveaux / personnalisés sous la bande de menu pendant le temps d’exécution. Le problème était les contrôles à quai, a décidé de décrocher du haut de la forme et d’ignorer complètement la bande de menu entièrement, très ennuyeux si vous me demandez. Comme cela devait être fait dynamicment avec du code et non en mode conception, cela devenait extrêmement frustrant. Le moyen le plus simple que j’ai trouvé consiste à créer un panneau en mode conception et à le placer sous la bande de menu. De là, vous pouvez simplement append / supprimer les contrôles sur le panneau et vous pouvez le connecter pendant l’exécution. Pas besoin de jouer avec tous vos contrôles sur votre formulaire qui n’ont pas vraiment besoin de changer, trop de travail en fonction de ce que vous devez vraiment faire.

 object.dock = Fill Panel.Controls.Add(object)