【问题标题】:Change row/column span programmatically (tablelayoutpanel)以编程方式更改行/列跨度(tablelayoutpanel)
【发布时间】:2010-05-04 06:28:58
【问题描述】:

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

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

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

怎么做?

【问题讨论】:

    标签: c# winforms tablelayoutpanel


    【解决方案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);
        }
    }
    

    【讨论】:

    • 很棒的代码。 Visual Studio Designer 误导了我。我正在查看 button1 属性,正在尝试将 button1 转换为工具提示面板项目等等......谢谢!
    • 如果您查看了 Form.Designer.cs 而不是可视化设计器,您可以直接找到解决方案。 ;-)
    • 我知道这是一篇旧文章,但我想指出您不需要在 C# 中执行“yoda 条件”,因为 if 语句是强类型的。 (而且我相信,如果您确实在布尔值上犯了错误并使用赋值而不是比较,它会生成编译器警告,而不是使用任何其他类型生成的错误。)
    【解决方案2】:

    虽然我发现当前投票赞成的答案相当充分,但它似乎也比需要的稍微混乱。您必须先将控件添加到 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
    • label3:0,2

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

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

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

    【讨论】:

    • tableLayoutPanel1.SetColumnSpan(myControl, 2) 正是我想要的。
    猜你喜欢
    • 2015-05-06
    • 2010-11-11
    • 1970-01-01
    • 2023-01-17
    • 2011-11-20
    • 1970-01-01
    • 2014-11-21
    • 2013-08-21
    • 2013-01-13
    相关资源
    最近更新 更多