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

Але*_* Д. 16 c# tablelayoutpanel winforms

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

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

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

怎么样?

Oli*_*ver 28

这段代码怎么样?

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

虽然我认为当前的投票答案很充分,但看起来也比需要的稍微混乱。在设置控件的属性之前,必须将其添加到tableLayoutPanel中。

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

说明:

tableLayoutPanel.Controls.Add(**control**, x, y)
tableLayoutPanel.SetColumnSpan(**control**, '# of cols to span')
Run Code Online (Sandbox Code Playgroud)

例:

tableLayoutPanel1.Controls.Add(**button1**, 0, 0);
tableLayoutPanel1.SetColumnSpan(**button1**, 2);
tableLayoutPanel1.SetRowSpan(**button1**, 3);
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

它会像跨度设置为当前网格(tableLayoutPanel)的最大大小一样执行/执行。仅当TLP /电网尺寸改变时,这才有意义。

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

例如:将label1label2label3加到0,0。

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

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

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

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