2009-08-14 9 views
0

J'écris une application dans .NET 2.0 et j'ai besoin des fonctionnalités d'un FlowLayoutPanel de WinForms. Voici le code que je suis venu avec ce que j'utilise en ce moment (la plupart du temps avec des étiquettes):FlowLayoutPanel dans CF.NET

/// <summary> 
/// Flowable layout panel 
/// </summary> 
public partial class FlowLayoutPanel : Panel 
{ 
    public FlowLayoutPanel() 
    { 
     InitializeComponent(); 
    } 

    /// <summary> 
    /// Flow the layout of the panel. Required before presentation. 
    /// </summary> 
    public void Layout() 
    { 
     int top = 0; 

     // Set control position 
     foreach (Control ctrl in this.Controls) 
     { 
      ctrl.Top = top; 
      // Account for the scrollbar 
      ctrl.Width = this.Width - 17; 

      top += ctrl.Height; 
     } 
    } 
}

Le panneau est ajouté à la forme (dans mon cas, une page de l'onglet généré dynamiquement), puis ajouter contrôles dans la vue de code du formulaire, comme ceci:

panel.Controls.Add(new Label() { Text = "Item name", Font = boldTahoma }); 
panel.Controls.Add(new Label() { Text = item.ItemName }); 
panel.Controls.Add(new Label() { Text = "Category", Font = boldTahoma }); 
panel.Controls.Add(new Label() { Text = item.Category }); 
panel.Controls.Add(new Label() { Text = "Quantity", Font = boldTahoma }); 
panel.Controls.Add(new Label() { Text = item.Quantity }); 

panel.Layout();

Donc je suppose que j'ai deux questions. Cela fonctionne, mais y a-t-il une meilleure façon de le faire (surtout pour ne pas avoir à appeler Layout() à chaque fois) et y a-t-il un moyen de faire des étiquettes auto-hauteur? Merci.

Répondre

2

Vous pouvez définir Dock = DockStyle.Top sur tous vos contrôles, ou vous pouvez utiliser une liste déroulante OwnerDraw (j'utilise celle d'OpenNetCF.com). Cela dépend du nombre d'éléments que vous devez afficher. J'ai trouvé que l'utilisation de la ListBox OwnerDraw est plus rapide lorsque vous avez beaucoup d'éléments, mais l'approche Panel est plus facile à développer.

Une remarque: Appelez SuspendLayout avant d'ajouter vos contrôles et ResumeLayout lorsque vous avez terminé.

1

Si c'est votre code actuel, alors il ne s'écoule pas du tout. Il implémente un WPP stackPanel, et vous pouvez obtenir le même effet en définissant Dock=DockStyle.Top pour tous les contrôles. Dock est disponible en CF.

Questions connexes