2009-08-14 30 views
0

我在.NET 2.0中编写应用程序,我需要WinForms中的FlowLayoutPanel的功能。这是我想出了,我现在使用(主要是与标签)的代码:CFL中的FlowLayoutPanel

/// <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; 
     } 
    } 
}

该面板添加到窗体(在我的情况,动态生成的标签页),然后我添加在代码视图中的控件,如下所示:

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();

所以我想我有两个问题。它的工作原理,但有没有更好的方法来做到这一点(尤其是我不必每次都打电话Layout()),有没有办法让标签自动调高?谢谢。

回答

2

您可以在所有控件上设置Dock = DockStyle.Top,也可以使用OwnerDraw列表框(我使用OpenNetCF.com中的一个)。这取决于您必须显示多少项目。我发现使用OwnerDraw列表框的速度更快,但是面板方法更易于开发。

一个注意事项:在添加控件之前调用SuspendLayout,完成后调用ResumeLayout。

1

如果这是您的实际代码,那么它根本就不是流动的。它实现了一个WPF stackPanel,并且通过为所有控件设置Dock=DockStyle.Top可以获得相同的效果。 Dock在CF中可用。