Add Row Dynamically in TableLayoutPanel

强颜欢笑 提交于 2019-12-02 18:51:47

Try the below code,

// TableLayoutPanel Initialization
TableLayoutPanel panel = new TableLayoutPanel();
panel.ColumnCount = 3;
panel.RowCount = 1;
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 40F));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 30F));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 30F));
panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
panel.Controls.Add(new Label() { Text = "Address" }, 1, 0);
panel.Controls.Add(new Label() { Text = "Contact No" }, 2, 0);
panel.Controls.Add(new Label() { Text = "Email ID" }, 3, 0);

// For Add New Row (Loop this code for add multiple rows)
panel.RowCount = panel.RowCount + 1;
panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 50F));
panel.Controls.Add(new Label() { Text = "Street, City, State" }, 1, panel.RowCount-1);
panel.Controls.Add(new Label() { Text = "888888888888" }, 2, panel.RowCount-1);
panel.Controls.Add(new Label() { Text = "xxxxxxx@gmail.com" }, 3, panel.RowCount-1);

I know that this question is very old, but someone could take this as useful thing.

First of all note that petchirajan answer is good, but if you have at least one existent row (titles, for example) and you want to continue the list using height set using visual editor, without modify the code, you can use this:

private void AddItem(string address, string contactNum, string email )
    {
        //get a reference to the previous existent 
        RowStyle temp = panel.RowStyles[panel.RowCount - 1];
        //increase panel rows count by one
        panel.RowCount++;
        //add a new RowStyle as a copy of the previous one
        panel.RowStyles.Add(new RowStyle(temp.SizeType, temp.Height));
        //add your three controls
        panel.Controls.Add(new Label() {Text = address}, 0, panel.RowCount - 1);
        panel.Controls.Add(new Label() { Text = contactNum }, 1, panel.RowCount - 1);
        panel.Controls.Add(new Label() { Text = email }, 2, panel.RowCount - 1);
    }

If you prefer generic method for a generic table:

private void AddRowToPanel(TableLayoutPanel panel, string[] rowElements)
    {
        if (panel.ColumnCount != rowElements.Length)
            throw new Exception("Elements number doesn't match!");
        //get a reference to the previous existent row
        RowStyle temp = panel.RowStyles[panel.RowCount - 1];
        //increase panel rows count by one
        panel.RowCount++;
        //add a new RowStyle as a copy of the previous one
        panel.RowStyles.Add(new RowStyle(temp.SizeType, temp.Height));
        //add the control
        for (int i = 0; i < rowElements.Length; i++)
        {
            panel.Controls.Add(new Label() { Text = rowElements[i] }, i, panel.RowCount - 1);
        }
    }

You can do this also using a Collection instead of an array using

 private void AddRowToPanel(TableLayoutPanel panel, IList<string> rowElements)
    ...

Hope it helps.

in foreach example:

int i=0;
foreach (KeyValuePair<string,string> kv in MyCollection)
{
    tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
    tableLayoutPanel1.Controls.Add(new Label() { Text = kv.Key }, 0, i);
    i++;
}

Here are a couple extension methods you can use:

You can call them by doing the following:

TableLayoutPanel tablePanel = new TableLayoutPanel(); //Initialize and do any other construction
tablePanel.AddColumn(null, "Column1");
tablePanel.AddRow(new RowStyle() { SizeType = SizeType.Absolute, Height = 50 }, "RowData1", "RowData2", "RowData3");
public static int AddRow(this TableLayoutPanel table, RowStyle rowStyle = null, params string[] rowData)
{
    List<Label> labels = new List<Label>();
    rowData.ToList().ForEach(p => labels.Add(new Label() { Text = p }));
    return table.AddRow(rowStyle, labels.ToArray());
}

public static int AddRow(this TableLayoutPanel table, RowStyle rowStyle = null, params Control[] rowData)
{
    table.RowCount = table.RowCount + 1;

    if (rowStyle == null)
        rowStyle = new RowStyle(SizeType.AutoSize);

    table.RowStyles.Add(rowStyle);

    for (int i = 0; i < rowData.Length; i++)
    {
        if (i > table.ColumnCount - 1)
            break;

        table.Controls.Add(rowData[i], i, table.RowCount - 1);
    }

    return table.RowCount - 1;
}

public static int AddColumn(this TableLayoutPanel table, ColumnStyle columnStyle = null, params string[] columnData)
{
    List<Label> labels = new List<Label>();
    columnData.ToList().ForEach(p => labels.Add(new Label() { Text = p }));
    return table.AddColumn(columnStyle, labels.ToArray());
}

public static int AddColumn(this TableLayoutPanel table, ColumnStyle columnStyle = null, params Control[] columnData)
{
    table.ColumnCount = table.ColumnCount + 1;

    if (columnStyle == null)
        columnStyle = new ColumnStyle(SizeType.AutoSize);

    table.ColumnStyles.Add(columnStyle);

    for (int i = 0; i < columnData.Length; i++)
    {
        if (i > table.RowCount - 1)
            break;

        table.Controls.Add(columnData[i], table.ColumnCount - 1, i);
    }

    return table.ColumnCount - 1;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!