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

我有一个tablelayoutpanel。 2×2 – 2列2行。

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

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

怎么样?

这段代码怎么样?

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

虽然我发现当前最高投票的答案相当充分,但它似乎也比需要的稍微麻烦一些。 在设置其属性之前,必须将控件添加到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); 

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

 OOXXX OOXXX OOXXX XXXXX XXXXX 

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

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

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

例如: label1label2label3被添加到0,0。

  • label1将出现在0,0中
  • label2 :0,1
  • label3 :0,2

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

  • label1 :0,0
  • label2 :重新定位到0.2
  • label3 :0,3

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