TableLayoutPanel:在调整窗口大小时动态设置列数

时间:2014-09-12 18:14:15

标签: winforms c#-4.0

我在Windows窗体上有一个TableLayoutPanel,当窗体窗口重新调整大小时,如何设置动态列数?例如,如果表单最大化,则为3列;如果将表单重新调整为较小的大小,则为2列?

感谢您提供任何帮助!

3 个答案:

答案 0 :(得分:0)

更大:

        panel.ColumnCount = 3;

小:

        panel.ColumnCount = 2;

答案 1 :(得分:0)

下面是一个示例,您可以使用所需的宽度动态添加列。

在TableLayoutPanel中:   将GrowStyle设置为AddColumns 检查结果   设置Dockstyle以填充和   将CellBorderStyle设置为Single

现在向表单添加resize事件..

public Form1()
    {
        InitializeComponent();
        this.Resize += Form1_Resize;
    }

    void Form1_Resize(object sender, EventArgs e)
    {
        int desiredWidthPerColumn = 100;
        setColumnsWidth(desiredWidthPerColumn, tableLayoutPanel1);
    }

    void setColumnsWidth(int width, TableLayoutPanel tPanel)
    {
        tPanel.ColumnCount = tPanel.Width / width;
        for (int i = 0; i < tPanel.ColumnStyles.Count; i++) tPanel.ColumnStyles.RemoveAt(i);
        for (int i = 0; i < tPanel.ColumnCount; i++) tPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, width));
    }

答案 2 :(得分:0)

感谢您的帮助,Sayka。 这是我使用的最终分辨率。我在这里张贴以防万一以后有人可能需要它。 TableLayoutPanel被设置为增长“AddRows”,因为它需要增长行和列,我有以下代码来处理列。 我有两个for循环删除现有的Column样式,因为一个for循环不会删除所有,它会留下最后一个。也许它不是最好的解决方案,但它确实有用。

TableLayoutPanel位于一个组框内,这是groupbox的sizeChanged事件:

    private void groupBox2_SizeChanged(object sender, EventArgs e)
    {
        int avaiableWidth = this.groupBox2.Width;
        int maxLableWidth = 150; //button width = 140 + 10 margin
        this.tlpButtons.ColumnCount = avaiableWidth / maxLableWidth;

        List<ColumnStyle> stylesToRemove = new List<ColumnStyle>();
        foreach (ColumnStyle style in tlpButtons.ColumnStyles)
            stylesToRemove.Add(style);
        foreach (ColumnStyle style in stylesToRemove)
            tlpButtons.ColumnStyles.Remove(style);

        for (int i = 0; i < this.tlpButtons.ColumnCount; i++)
        {
            ColumnStyle c = new ColumnStyle();
            c.SizeType = SizeType.Percent;
            c.Width = Convert.ToSingle(Math.Floor((decimal)100 / (decimal)this.tlpButtons.ColumnCount));
            this.tlpButtons.ColumnStyles.Add(c);
        }
        this.tlpButtons.Refresh();            
    }

欢迎任何建议或更好的想法!