19

我有一个表格布局面板。2x2 - 2 列 2 行。

例如,我在 1 行第二列中添加了一个按钮button1 。button1的停靠属性设置为 Fill。VS Designer 允许设置button1的列/行跨度属性。

我想要以编程方式更改button1 的行跨度属性的可用性,因此它可以填充所有第二列(1 行和第二行)并且可以将其设置回来。

如何?

4

2 回答 2

33

这段代码呢?

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);
    }
}
于 2010-05-04T06:55:46.827 回答
7

虽然我发现当前投票赞成的答案非常充分,但它似乎也比需要的稍微混乱。您必须先将控件添加到 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/网格大小发生变化时才有意义。

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

例如:label1label2label3添加到 0,0。

  • label1将出现在 0,0
  • 标签2:0,1
  • 标签3:0,2

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

  • 标签1:0,0
  • label2 : 重定位到 0,2
  • 标签3:0,3

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

于 2015-09-28T20:32:33.550 回答