C# 以编程方式更改行/列跨度(tablelayoutpanel)

C# 以编程方式更改行/列跨度(tablelayoutpanel),c#,winforms,tablelayoutpanel,C#,Winforms,Tablelayoutpanel,我有一个桌面面板。2x2-2列2行 例如,我在一行第二列中添加了一个按钮1。button1将dock属性设置为Fill。VS Designer允许设置button1的列/行范围属性 我需要一个可用性来以编程方式更改button1的row span属性,这样它就可以填充所有第二列(1行和第二行),并且可以将其设置回原来的位置 怎么做?这段代码怎么样 private void button1_Click(object sender, EventArgs e) { var control =

我有一个桌面面板。2x2-2列2行

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

我需要一个可用性来以编程方式更改button1的row span属性,这样它就可以填充所有第二列(1行和第二行),并且可以将其设置回原来的位置

怎么做?

这段代码怎么样

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);
结果:一个按钮“占据”了这个空间。(前提是它足够大以覆盖该区域。即使它不“覆盖”该空间,它仍将“保留”该空间。)

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

它的作用/执行方式与跨度被设置为当前网格(tableLayoutPanel)的最大大小相同。这仅在TLP/网格大小发生变化时相关

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

例如:label1label2label3添加到0,0

  • 标签1将显示在0,0中
  • 标签2:0,1
  • 标签3:0,2
例2:标签1的行跨度为2

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

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

代码很棒。Visual Studio设计师误导了我。我在查看button1属性,试图将button1转换为toolstippanel项等等。。。谢谢如果您查看了Form.Designer.cs而不是visualdesigner,则可以直接找到解决方案。;-)我知道这是一篇老文章,但我想指出,你不需要在C#中使用“yoda条件”,因为if语句是强类型的。(我相信,如果你在布尔值上犯了错误,并且用赋值代替比较,它会生成一个编译器警告,而不是任何其他类型的错误。)
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