Windows窗体中Panel控件的大小调整

时间:2015-01-28 06:55:22

标签: c# winforms panel

我的winform上有一个Panel控件,里面会显示多个面板。对于每个内部面板,我设置它的高度。但有些内容较少,有些内容较多。

Panel hrvPanel = new Panel();
ArrayList hrvColl = pnlColl ; //Panel collection list gets from a Method            
if(hrvColl.Count == 0)
            return;
        int splits = 0;
        for(int p= hrvColl.Count-1;p>=0;p--)
        {
            Panel hrv = hrvColl[p] as Panel;
            hrv.Height = 150;
            hrvPanel.Controls.Add(hrv);

            //Adding splliter
            if(splits < hrvColl.Count - 1)
            {
                Splitter splitGrid = new Splitter();
                splitGrid.Dock = DockStyle.Top;
                hrvPanel.Controls.Add(splitGrid);
                splits++;
            }
        }
  hrvPanel.Dock = DockStyle.Top;

如何根据内容大小调整每个内部面板的高度?我尝试将hrv.AutoSize设置为true,然后我只能看到最后一个面板和hrv.Dock = Top但结果是相同的。

2 个答案:

答案 0 :(得分:1)

如果外部PanelAutosize = true能够看到所有内部Panels。的承诺。

如果你没有,你的设置有误。确保内部Dock中未使用AnchorPanels的不需要的设置。

编写代码以查找所有内部面板的Top + Height的最大值也非常简单:

int max = 0;
foreach (Control ctl in panelOuter.Controls) 
   if (ctl.Top + ctl.Height > max) max = ctl.Top + ctl.Height;
panelOuter.Height = max + 3;  // add the default margin!

如果你只想设置Height并保留Width,那么这可能很有用。除此之外:AutoSize属性将完成它的工作!

答案 1 :(得分:0)

这是WPF克服Winform的地方,您可能无法在Winforms中自动执行此操作。但是你可能会有这样的解决方法 -

  

创建一个应该知道其首选高度的扩展面板类

class ExPanel : Panel
{
    public int PreferredHeight
    {
        get;
        private set;
    }
    public ExPanel(int preferredHeight)
        : base()
    {
        PreferredHeight = preferredHeight;
    }
}

然后您可以将此类用作 -

ExPanel hrvPanel = new ExPanel(150);
        System.Collections.ArrayList hrvColl = pnlColl; //Panel collection list gets from a Method            
        if (hrvColl.Count == 0)
            return;
        int splits = 0;
        for (int p = hrvColl.Count - 1; p >= 0; p--)
        {
            ExPanel hrv = hrvColl[p] as ExPanel;
            hrv.Height = hrv.PreferredHeight;
            hrvPanel.Controls.Add(hrv);

            //Adding splliter
            if (splits < hrvColl.Count - 1)
            {
                Splitter splitGrid = new Splitter();
                splitGrid.Dock = DockStyle.Top;
                hrvPanel.Controls.Add(splitGrid);
                splits++;
            }
        }
        hrvPanel.Dock = DockStyle.Top;
如果您不想管理每个小组的高度,那么它只是实现目标的一种解决方法。