簡體   English   中英

在 TableLayoutPanel 中動態添加行

[英]Add Row Dynamically in TableLayoutPanel

在此處輸入圖片說明

我想在 c# 中的 Windows 窗體的 TableLayoutPanel 中逐行動態添加這些條目

我怎樣才能做到這一點?

試試下面的代碼,

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

我知道這個問題很老了,但有人會發現以下內容很有用:

首先,請注意 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);
        }
    }

您也可以使用 Collection 而不是數組來執行此操作:

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

希望這可以幫助。

在 foreach 示例中:

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

以下是您可以使用的幾種擴展方法:

您可以通過執行以下操作來調用它們:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM