.NET Framework / C # / Formulaires Windows P>
J'aimerais que le FlowLayOntPanneau ajuste automatiquement sa largeur ou sa hauteur en fonction du nombre de commandes à l'intérieur. Il devrait également modifier le nombre de colonnes / lignes s'il n'y a pas assez d'espace (enveloppez son contenu). Le problème est que si je règle automatiquement, le FlowLayOntPanel n'entente pas les commandes I Insérer. Quelle solution est le meilleur? P>
merci! p>
6 Réponses :
Ajoutez-vous les commandes basées sur les actions de l'utilisateur? J'ai bien peur d'avoir besoin de changer les propriétés Flowlayout à la volée en code, lors de l'ajout de nouvelles commandes, alors rafraîchir le formulaire ferait le tour. P>
Avez-vous essayé d'utiliser le tableau TableLayOntPanel? Il est très utile de placer des contrôles dans les cellules. P>
L'utilisation de TableLayOntPanel A) a un cas d'utilisation complètement différent et B) est un cauchemar encore pire.
Il n'y a pas de telle chose comme impossible dans le développement de logiciels. Impossible prend juste plus de temps.
J'ai enquêté sur le problème. S'il est vraiment nécessaire de disposer de la mise en page, cela peut être fait avec un peu de travail. Puisque FlowLayOntPanel dépose les commandes sans penser particulièrement au nombre de lignes / colonnes, mais plutôt de largeur / hauteur cumulée, vous devrez peut-être suivre le nombre de contrôles que vous avez déjà ajoutés. Tout d'abord, définissez l'autosize sur FALSE, puis accrochez votre propre logique de gestion de taille aux événements contrôadrés / contrôlées. L'idée est de définir la largeur et la hauteur du panneau de manière à ce que vous obtiendrez le nombre de «colonnes» souhaitée p>
sale preuve de concept: p> Si le panneau a initialement une largeur pour 4 commandes, elle générera une ligne pour de nouvelles. Le gestionnaire contrôlé doit vérifier la même chose et diminuer la hauteur du panneau, ou obtenir toutes les commandes contenues et les placer à nouveau. Vous devriez y penser, ce n'est peut-être pas le genre de chose que vous voulez. Cela dépend des scénarios d'utilisation. Tous les contrôles seront-ils de la même taille? Sinon, vous auriez besoin de la logique plus compliquée. P> mais vraiment, pensez à la mise en page de la table - vous pouvez envelopper une classe d'assistance ou en tirer un nouveau contrôle, où vous résolvez tout le contrôle de la commande. logique. FlowLayout est facile à ajouter et à supprimer des commandes, mais ensuite le code de gestion de la taille consiste. TableLayout vous donne un bon mécanisme pour des lignes et des colonnes, la gestion de la largeur et de la hauteur est plus facile, mais vous auriez besoin de plus de code pour changer le placement de tous. Contrôles Si vous souhaitez enlever un du formulaire de manière dynamique. P> P>
Si possible, je vous suggère de réapparaître le FlowLayOntPanel de manière à utiliser toute la largeur disponible, puis à l'ancrer en haut, à gauche et à droite. Cela devrait le faire grandir en hauteur si nécessaire tout en enveloppant les commandes. P>
Mais comment dites-vous le flowlayoutpanel code> pour mettre à jour automatiquement sa propriété code> de hauteur code> en fonction du nombre de lignes qu'il a nécessaires pour créer lors de l'emballage du contenu? J'aime l'idée d'ancrage de haut, de gauche et de droite, mais la hauteur code> de mon flowlayoutpanel code> semble toujours rester constante ...
Définissez le maximum de flowLayOntPanel sur la largeur que vous souhaitez envelopper. Définir des enveloppes = true. P>
Définir la taille maximale nécessaire au calcul de la taille maximale
Je sais que c'est un vieux fil, mais si quelqu'un d'autre se demande ici, voici la solution que j'ai fabriquée - définissez AutoSize sur true sur le panneau et appelez cette méthode d'extension à partir de l'événement Redimension du panneau de débit:
public static void ReOrganise(this FlowLayoutPanel panel)
{
var width = 0;
Control prevChildCtrl = null;
panel.SuspendLayout();
//Clear flow breaks
foreach (Control childCtrl in panel.Controls)
{
panel.SetFlowBreak(childCtrl, false);
}
foreach (Control childCtrl in panel.Controls)
{
width = width + childCtrl.Width;
if(width > panel.Width && prevChildCtrl != null)
{
panel.SetFlowBreak(prevChildCtrl, true);
width = childCtrl.Width;
}
prevChildCtrl = childCtrl;
}
panel.ResumeLayout();
}
Je suis surpris que personne n'a répondu à celui-ci, j'ai le même problème. Cogner?
TableLayOntPanel peut être une meilleure solution pour vous - il a pris en charge la prise en charge des colonnes et des lignes de dimensionnement automatique, ainsi que de la taille automatique de l'ensemble du panneau.