首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Winforms TableLayoutPanel以编程方式添加行

Winforms TableLayoutPanel以编程方式添加行
EN

Stack Overflow用户
提问于 2009-07-17 12:07:03
回答 8查看 151.7K关注 0票数 86

我已经为此斗争了一段时间了,我发现其他一些人也在为TableLayoutPanel (.net 2.0Winforms)而苦苦挣扎。

Problem

我尝试获取一个“空白”的tablelayoutpanel,它定义了10列,然后在运行时以编程方式添加控件行(即每个单元格一个控件)。

有人可能认为它应该像这样简单

代码语言:javascript
复制
myTableLayoutPanel.Controls.Add(myControl, 0 /* Column Index */, 0 /* Row index */);

但这(对我来说)并没有添加行。所以可能会添加一个行样式

代码语言:javascript
复制
myTableLayoutPanel.RowStyles.Clear();
myTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 30F));

但这也不起作用。我深入研究了一下,发现myTableLayoutPanel.RowCount的使用从设计时到运行时都会发生变化,因此执行myTableLayoutPanel.RowCount++;实际上不会添加其他行,甚至在为其添加RowStyle条目之前/之后也不会!

我遇到的另一个相关问题是,控件将被添加到显示中,但它们都只是在TableLayoutPanel的第0,0点渲染,此外,它们甚至没有被约束在它们应该显示的单元格边界内(即,在Dock = DockStyle.Fill的情况下,它们仍然看起来太大/太小)。

有没有人有在运行时添加行和控件的工作示例?

EN

回答 8

Stack Overflow用户

发布于 2010-02-02 13:58:06

我上个星期才做的。将TableLayoutPanel上的GrowStyle设置为AddRowsAddColumns,然后您的代码就可以工作了:

代码语言:javascript
复制
// Adds "myControl" to the first column of each row
myTableLayoutPanel.Controls.Add(myControl1, 0 /* Column Index */, 0 /* Row index */);
myTableLayoutPanel.Controls.Add(myControl2, 0 /* Column Index */, 1 /* Row index */);
myTableLayoutPanel.Controls.Add(myControl3, 0 /* Column Index */, 2 /* Row index */);

以下是一些看起来与您正在做的事情类似的工作代码:

代码语言:javascript
复制
    private Int32 tlpRowCount = 0;

    private void BindAddress()
    {
        Addlabel(Addresses.Street);
        if (!String.IsNullOrEmpty(Addresses.Street2))
        {
            Addlabel(Addresses.Street2);
        }
        Addlabel(Addresses.CityStateZip);
        if (!String.IsNullOrEmpty(Account.Country))
        {
            Addlabel(Address.Country);
        }
        Addlabel(String.Empty); // Notice the empty label...
    }

    private void Addlabel(String text)
    {            
        label = new Label();
        label.Dock = DockStyle.Fill;
        label.Text = text;
        label.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
        tlpAddress.Controls.Add(label, 1, tlpRowCount);
        tlpRowCount++;
    }

TableLayoutPanel总是能给我合适的尺寸。在上面的示例中,我正在归档一个地址卡,它可能会根据地址行为2的帐户或国家/地区的不同而增大或缩小。因为表格布局面板的最后一行或最后一列将会伸展,所以我将空标签放入其中以强制新的空行,然后一切都会很好地排列在一起。

下面是设计器代码,这样您就可以看到我开始时使用的表:

代码语言:javascript
复制
        //
        // tlpAddress
        // 
        this.tlpAddress.AutoSize = true;
        this.tlpAddress.BackColor = System.Drawing.Color.Transparent;
        this.tlpAddress.ColumnCount = 2;
        this.tlpAddress.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 25F));
        this.tlpAddress.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
        this.tlpAddress.Controls.Add(this.pictureBox1, 0, 0);
        this.tlpAddress.Dock = System.Windows.Forms.DockStyle.Fill;
        this.tlpAddress.Location = new System.Drawing.Point(0, 0);
        this.tlpAddress.Name = "tlpAddress";
        this.tlpAddress.Padding = new System.Windows.Forms.Padding(3);
        this.tlpAddress.RowCount = 2;
        this.tlpAddress.RowStyles.Add(new System.Windows.Forms.RowStyle());
        this.tlpAddress.RowStyles.Add(new System.Windows.Forms.RowStyle());
        this.tlpAddress.Size = new System.Drawing.Size(220, 95);
        this.tlpAddress.TabIndex = 0;
票数 74
EN

Stack Overflow用户

发布于 2010-02-22 05:52:22

这是一个奇怪的设计,但是TableLayoutPanel.RowCount属性没有反映RowStyles集合的数量,ColumnCount属性和ColumnStyles集合也是如此。

我发现我的代码中需要的是在对RowCount/ColumnCount进行更改后手动更新RowStyles/ColumnStyles

下面是我使用过的代码示例:

代码语言:javascript
复制
    /// <summary>
    /// Add a new row to our grid.
    /// </summary>
    /// The row should autosize to match whatever is placed within.
    /// <returns>Index of new row.</returns>
    public int AddAutoSizeRow()
    {
        Panel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
        Panel.RowCount = Panel.RowStyles.Count;
        mCurrentRow = Panel.RowCount - 1;
        return mCurrentRow;
    }

其他想法

  • 我从未使用DockStyle.Fill让控件填充网格中的单元格;我是通过设置控件的Anchors属性来完成此操作的。
  • 如果要添加大量控件,请确保在添加过程中调用SuspendLayoutResumeLayout,否则将运行缓慢,因为在添加每个控件后会重新创建整个窗体。
票数 30
EN

Stack Overflow用户

发布于 2010-02-19 00:02:45

下面是向两列TableLayoutColumn中添加新行的代码:

代码语言:javascript
复制
private void AddRow(Control label, Control value)
{
    int rowIndex = AddTableRow();
    detailTable.Controls.Add(label, LabelColumnIndex, rowIndex);
    if (value != null)
    {
        detailTable.Controls.Add(value, ValueColumnIndex, rowIndex);
    }
}

private int AddTableRow()
{
    int index = detailTable.RowCount++;
    RowStyle style = new RowStyle(SizeType.AutoSize);
    detailTable.RowStyles.Add(style);
    return index;
}

label控件位于左列,value控件位于右侧列。这些控件通常是Label类型,并将其AutoSize属性设置为true。

我不认为这很重要,但作为参考,下面是设置detailTable的设计器代码:

代码语言:javascript
复制
this.detailTable.ColumnCount = 2;
this.detailTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.detailTable.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.detailTable.Dock = System.Windows.Forms.DockStyle.Fill;
this.detailTable.Location = new System.Drawing.Point(0, 0);
this.detailTable.Name = "detailTable";
this.detailTable.RowCount = 1;
this.detailTable.RowStyles.Add(new System.Windows.Forms.RowStyle());
this.detailTable.Size = new System.Drawing.Size(266, 436);
this.detailTable.TabIndex = 0;

这一切都运行得很好。您应该知道,使用TableLayoutPanel属性从控件中动态释放控件似乎存在一些问题(至少在框架的某些版本中是这样)。如果您需要删除控件,我建议处理整个TableLayoutPanel并创建一个新的。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1142873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档