以编程方式更改行/列范围(tablelayoutpanel)

时间:2010-05-04 06:28:59

标签: c# winforms tablelayoutpanel

我有一个tablelayoutpanel。 2x2 - 2列2行。

例如,我在第1行第二列中添加了按钮 button1 button1 的dock属性设置为Fill。 VS Designer允许设置 button1 的列/行范围属性。

我想要一个可用性以 button1 以编程方式更改行范围属性,因此它可以填充所有第二列(1行和第二行)和可用性以将其设置回来

如何?

2 个答案:

答案 0 :(得分:26)

这段代码怎么样?

private void button1_Click(object sender, EventArgs e)
{
    var control = sender as Control;

    if(control == null)
        return;

    if (1 == tableLayoutPanel1.GetRowSpan(control))
    {
        tableLayoutPanel1.SetRowSpan(control, 2);
    }
    else
    {
        tableLayoutPanel1.SetRowSpan(control, 1);
    }
}

答案 1 :(得分:4)

虽然我发现当前上调的答案相当充分,但它似乎也比需要的稍微麻烦一些。在设置属性之前,必须将控件添加到tableLayoutPanel。

Visual Studio(2013和其他可能的版本)将这些属性显示为控件的一部分。实际上,它们是tableLayoutPanel的一部分。

说明:

tableLayoutPanel.Controls.Add(**control**, x, y)
tableLayoutPanel.SetColumnSpan(**control**, '# of cols to span')

示例:

tableLayoutPanel1.Controls.Add(**button1**, 0, 0);
tableLayoutPanel1.SetColumnSpan(**button1**, 2);
tableLayoutPanel1.SetRowSpan(**button1**, 3);

结果:一个“占据”此空间的按钮。 (如果它足够大以覆盖该区域。即使它没有“覆盖”该空间,它仍然会“保留”它。)

O O X X X
O O X X X
O O X X X
X X X X X
X X X X X

将跨度设置为大于网格的大小将...: 不要更改网格大小。 不裁剪/编辑网格大小的数字。 不要在编译时抛出错误。

它将执行/执行,就好像跨度设置为当前网格(tableLayoutPanel)的最大大小。这仅在TLP /网格大小更改时才相关。

如果以编程方式将两个控件添加到两个相同的网格位置,则网格中的第一个控件会保留其位置。随后添加的任何控件都会被推送到下一个单元块。如果添加'span',它将把该单元块视为已使用并继续搜索未使用的单元块。

例如: label1 label2 label3 被添加到0,0。

  • label1 将显示在0,0
  • label2 :0,1
  • label3 :0,2

例2:标签1的行跨度为2。

  • label1 :0,0
  • label2 :重新定位为0,2
  • label3 :0,3

选择正确的网格点和跨度后,您可以使用停靠栏和锚点属性进一步优化布局。