Добавить строку динамически в TableLayoutPanel

введите здесь описание изображения

Я хочу динамически добавлять эти записи построчно в TableLayoutPanel в Windows Form в С#

Как я могу это сделать?


person ΔȺȾΔ    schedule 15.03.2014    source источник


Ответы (4)


Попробуйте приведенный ниже код,

// 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 = "[email protected]" }, 3, panel.RowCount-1);
person petchirajan    schedule 15.03.2014
comment
Для всех, у кого могут быть проблемы с этим. Из-за изменений, которые я внес в конструктор, созданный дизайнером код добавил несколько RowStyles, хотя в нем была только одна строка. Это испортило добавление таких строк, потому что новые RowStyles не использовались должным образом. Если у вас есть проблемы, проверьте сгенерированный дизайнером код, чтобы убедиться, что у вас ровно столько RowStyles, сколько есть строк. - person sbecker; 20.02.2021

Я знаю, что этот вопрос очень старый, но кто-то может найти следующее полезным:

Прежде всего, обратите внимание, что ответ petchirajan хорош, но если у вас есть хотя бы одна существующая строка (например, заголовки) и вы хотите продолжить список, используя высоту, установленную с помощью визуального редактора, и без необходимости изменять код, вы можно использовать это:

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);
    }

Если вы предпочитаете общий метод для общей таблицы:

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);
        }
    }

Вы также можете сделать это, используя коллекцию вместо массива, используя:

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

Надеюсь это поможет.

person tedebus    schedule 30.11.2016
comment
нет ли способа добавить полосу прокрутки без растягивания и нажатия экранов? Пользовательский интерфейс после вставки нескольких строк становится очень странным - person Jamshaid K.; 04.07.2017
comment
@CodeIt помещает вашу TableLayoutPanel внутрь панели и устанавливает AutoScroll = true. TableLayoutPanel также будет прокручиваться в дизайнере. :) Не забудьте установить размер строк с определенными значениями и не используйте автоматические или процентные значения, чтобы избежать изменения размера строки! - person tedebus; 27.07.2017

в каждом примере:

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++;
}
person T.Todua    schedule 20.02.2018

Вот несколько методов расширения, которые вы можете использовать:

Вы можете вызвать их, выполнив следующие действия:

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;
}
person derekantrican    schedule 25.10.2019