-->

的WinForms TableLayoutPanel中编程添加行(Winforms TableLay

2019-06-14 20:21发布

我一直在争取与这一段时间,并已发现了一些其他人与TableLayoutPanel中(.NET 2.0的WinForms),以及奋斗。

问题

我试图采取一个“空白” TableLayoutPanel中,其具有限定的10列,然后在运行时以编程方式添加的对照行(每单元即一个控制)。

人们或许认为,它应该是那样简单

myTableLayoutPanel.Controls.Add(myControl, 0 /* Column Index */, 0 /* Row index */);

但是,(我)不会添加行。 在一排的风格,所以也许增加

myTableLayoutPanel.RowStyles.Clear();
myTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 30F));

但是,这并不工作。 我周围挖,发现该myTableLayoutPanel.RowCount从设计时的使用改变运行时间,因此在做myTableLayoutPanel.RowCount++; 实际上并没有添加其他行,甚至不前/加为它RowStyle条目之后!

我遇到另一个相关的问题是,控件将被添加到显示,但他们都只是获得在TableLayoutPanel中的点0,0呈现,此外,他们甚至不限制为在细胞内的界限,使他们都应该是内显示(即,与基座= DockStyle.Fill它们仍出现太大/小)。

是否有人有在运行时添加行与控制工作的例子吗?

Answer 1:

我只是这个没有上周。 设置GrowStyleTableLayoutPanelAddRowsAddColumns ,那么你的代码应工作:

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

这里似乎类似于你在做什么工作的一些代码:

    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总是给我用一刀切。 在我上面的例子中,我提交的是可能会增长或因具有地址线两条,或一个国家的账户缩水的地址卡片。 因为最后行或列的表格布局面板将伸展的,我扔的空标签,在那里,迫使一个新的空行,那么一切都排队很好。

这里是设计师的代码,所以你可以看到我先表:

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


Answer 2:

这是一个奇怪的设计,但TableLayoutPanel.RowCount属性并不反映的计数RowStyles收集,同样的ColumnCount属性和ColumnStyles集合。

什么我发现我需要在我的代码是手动更新RowCount / ColumnCount更改后RowStyles / ColumnStyles

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

    /// <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周围的过程中,添加的每个控制后,整个形式重新铺设否则事情会运行缓慢。



Answer 3:

这是我添加一个新行两列TableLayoutColumn代码:

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

标签控制进入在左边的列和值控制云在右列。 控件通常是类型的标签,并有自己的AutoSize属性设置为true。

我不认为这都不算什么,但对于引用,这里是设置detailTable设计师代码:

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;

这一切工作就好了。 你应该知道,似乎有一些问题与动态使用Controls属性(至少在该构架的一些版本)从一个TableLayoutPanel处置控制。 如果您需要删除的控制,我建议配置整个TableLayoutPanel中并创建一个新的。



Answer 4:

请在您的形式两列的表布局面板,并将其命名tlpFields

然后,简单地添加新的控制表的布局面板(在这种情况下,我加入柱1 5个标签和文本框5以列2)。

tlpFields.RowStyles.Clear();  //first you must clear rowStyles

for (int ii = 0; ii < 5; ii++)
{
    Label l1= new Label();
    TextBox t1 = new TextBox();

    l1.Text = "field : ";

    tlpFields.Controls.Add(l1, 0, ii);  // add label in column0
    tlpFields.Controls.Add(t1, 1, ii);  // add textbox in column1

    tlpFields.RowStyles.Add(new RowStyle(SizeType.Absolute,30)); // 30 is the rows space
}

最后,运行代码。



Answer 5:

我只是看着我的代码。 在一个应用中,我刚才添加的控制,但没有指定索引,和做的,我只是循环时,通过该行的风格和设置大小类型自动调整大小。 因此,只要将它们添加而无需指定指数似乎添加行如预期(提供的GrowStyle设置为AddRows)。

在另一个应用中,我明确的控制和RowCount属性设置为需要的值。 这不添加RowStyles。 然后,添加我的控制,这次指定的指数,并添加新的RowStyle( RowStyles.Add(new RowStyle(...)这也适用。

因此,挑选的这些方法中的一种,它们都工作。 我记得表布局面板引起了我的头痛。



Answer 6:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim dt As New DataTable
        Dim dc As DataColumn
        dc = New DataColumn("Question", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)

        dc = New DataColumn("Ans1", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)
        dc = New DataColumn("Ans2", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)
        dc = New DataColumn("Ans3", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)
        dc = New DataColumn("Ans4", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)
        dc = New DataColumn("AnsType", System.Type.GetType("System.String"))
        dt.Columns.Add(dc)


        Dim Dr As DataRow
        Dr = dt.NewRow
        Dr("Question") = "What is Your Name"
        Dr("Ans1") = "Ravi"
        Dr("Ans2") = "Mohan"
        Dr("Ans3") = "Sohan"
        Dr("Ans4") = "Gopal"
        Dr("AnsType") = "Multi"
        dt.Rows.Add(Dr)

        Dr = dt.NewRow
        Dr("Question") = "What is your father Name"
        Dr("Ans1") = "Ravi22"
        Dr("Ans2") = "Mohan2"
        Dr("Ans3") = "Sohan2"
        Dr("Ans4") = "Gopal2"
        Dr("AnsType") = "Multi"
        dt.Rows.Add(Dr)
        Panel1.GrowStyle = TableLayoutPanelGrowStyle.AddRows
        Panel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single
        Panel1.BackColor = Color.Azure
        Panel1.RowStyles.Insert(0, New RowStyle(SizeType.Absolute, 50))
        Dim i As Integer = 0

        For Each dri As DataRow In dt.Rows



            Dim lab As New Label()
            lab.Text = dri("Question")
            lab.AutoSize = True

            Panel1.Controls.Add(lab, 0, i)


            Dim Ans1 As CheckBox
            Ans1 = New CheckBox()
            Ans1.Text = dri("Ans1")
            Panel1.Controls.Add(Ans1, 1, i)

            Dim Ans2 As RadioButton
            Ans2 = New RadioButton()
            Ans2.Text = dri("Ans2")
            Panel1.Controls.Add(Ans2, 2, i)
            i = i + 1

            'Panel1.Controls.Add(Pan)
        Next


Answer 7:

这完全适用于一个TableLayoutPanel添加行和控制。

定义3列空白TableLayoutPanel中设计页面

    Dim TableLayoutPanel3 As New TableLayoutPanel()

    TableLayoutPanel3.Name = "TableLayoutPanel3"

    TableLayoutPanel3.Location = New System.Drawing.Point(32, 287)

    TableLayoutPanel3.AutoSize = True

    TableLayoutPanel3.Size = New System.Drawing.Size(620, 20)

    TableLayoutPanel3.ColumnCount = 3

    TableLayoutPanel3.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single

    TableLayoutPanel3.BackColor = System.Drawing.Color.Transparent

    TableLayoutPanel3.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 26.34146!))

    TableLayoutPanel3.ColumnStyles.Add(New ColumnStyle(SizeType.Percent, 73.65854!))

    TableLayoutPanel3.ColumnStyles.Add(New ColumnStyle(SizeType.Absolute, 85.0!))

    Controls.Add(TableLayoutPanel3)

创建一个按钮btnAddRow在每个点击添加行

     Private Sub btnAddRow_Click(sender As System.Object, e As System.EventArgs) Handles btnAddRow.Click

          TableLayoutPanel3.GrowStyle = TableLayoutPanelGrowStyle.AddRows

          TableLayoutPanel3.RowStyles.Add(New RowStyle(SizeType.Absolute, 20))

          TableLayoutPanel3.SuspendLayout()

          TableLayoutPanel3.RowCount += 1

          Dim tb1 As New TextBox()

          Dim tb2 As New TextBox()

          Dim tb3 As New TextBox()

          TableLayoutPanel3.Controls.Add(tb1 , 0, TableLayoutPanel3.RowCount - 1)

          TableLayoutPanel3.Controls.Add(tb2, 1, TableLayoutPanel3.RowCount - 1)

          TableLayoutPanel3.Controls.Add(tb3, 2, TableLayoutPanel3.RowCount - 1)

          TableLayoutPanel3.ResumeLayout()

          tb1.Focus()

 End Sub


Answer 8:

我只是有一个相关的问题(这是我发现这个线程),那里有我动态添加行和列的样式并没有发生作用。 我通常认为SuspendLayout()/ ResumeLayout()的优化,但在这种情况下,我的包裹在代码对其提出的行和列的行为正确。



文章来源: Winforms TableLayoutPanel adding rows programmatically