我有一个tablelayoutpanel。 2x2 - 2列2行。
例如,我在第1行第二列中添加了按钮 button1 。 button1 的dock属性设置为Fill。 VS Designer允许设置 button1 的列/行范围属性。
我想要一个可用性以 button1 以编程方式更改行范围属性,因此它可以填充所有第二列(1行和第二行)和可用性以将其设置回来
如何?
答案 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。
例2:标签1的行跨度为2。
选择正确的网格点和跨度后,您可以使用停靠栏和锚点属性进一步优化布局。