C# 添加到面板中的控件数达到阈值后,面板中的控件重叠

C# 添加到面板中的控件数达到阈值后,面板中的控件重叠,c#,winforms,datagridview,controls,panel,C#,Winforms,Datagridview,Controls,Panel,我已经编写了一个存储过程,它返回一组表及其名称。我正在将它们呈现到一个面板中。对于表名,我有一个保存值table name的标签:和一个实际保存表名的TextBox控件。接下来是一个DataGridView,它保存表数据。您可以在下面看到它的显示方式: 现在,对于非常大的返回结果,在以控件的形式呈现数据之后,一些控件在面板底部重叠。您可以在下图中看到: 基本上DataGridView、Label和TextBox控件是重叠的。我不知道这个问题的原因是什么。 几乎576个表(即49980行)作为要

我已经编写了一个存储过程,它返回一组表及其名称。我正在将它们呈现到一个面板中。对于表名,我有一个保存值table name的标签:和一个实际保存表名的TextBox控件。接下来是一个DataGridView,它保存表数据。您可以在下面看到它的显示方式:

现在,对于非常大的返回结果,在以控件的形式呈现数据之后,一些控件在面板底部重叠。您可以在下图中看到: 基本上DataGridView、Label和TextBox控件是重叠的。我不知道这个问题的原因是什么。 几乎576个表(即49980行)作为要呈现的数据返回。 下面是我用来渲染面板中控件的代码。


谁能告诉我这里基本上发生了什么。它是面板中可以呈现的控件的最大限制还是我的代码中有错误?

使用flowLayoutPanel代替面板。

否它不起作用。它只是在下面添加了一些空间,你可以向下滚动到更多的空白处。。。!!。没有奇怪的尺寸计算,没有人工。位置之类的东西。只是简单的属性和数据绑定。但给出的示例是WPF,对吗?我怎样才能在winform中模仿相同的东西…?你不能。这就是重点。winforms是完全无用的,不推荐使用。使用当前的技术,而不是试图从winforms中获得任何像样的东西。好的。谢谢你的建议@HighCore。无论如何,我需要在winforms本身中实现同样的功能。
int Offset = 0, RowCount = 0;
GridPanel.Controls.Clear();
foreach (DataTable table in ds.Tables)
{
    RowCount += table.Rows.Count;
    if (table.Rows.Count == 1 && table.Columns.Count == 1 && table.Columns[0].ColumnName.Equals("Table Name"))
    {
        Label label = new Label();
        label.Text = "Table Name : ";
        label.Width = 100;
        label.Location = new Point(5, Offset + 12);

    TextBox tableName = new TextBox();
    tableName.Text = table.Rows[0].ItemArray[0].ToString();
    tableName.Width = table.Rows[0].ItemArray[0].ToString().Length < 200 ? 200
        : Convert.ToInt32(table.Rows[0].ItemArray[0].ToString().Length * 0.8);
    tableName.ReadOnly = true;
    tableName.BackColor = Color.White;
    tableName.GotFocus += tableName_GotFocus;
    tableName.Location = new Point(label.Width + 10, Offset + 10);

    label.Font = tableName.Font = new System.Drawing.Font("Segoe UI", 10F, System.Drawing.FontStyle.Bold,
        System.Drawing.GraphicsUnit.Point, ((byte)(0)));

    GridPanel.Controls.Add(label);
    GridPanel.Controls.Add(tableName);

    Offset += (10 + tableName.Height + 10);
}
else
{
    DataGridView TableGrid = new DataGridView();
    TableGrid.Width = GridPanel.Width - 20;
    TableGrid.Height = ((table.Rows.Count * 40) < 62 ? 62
        : (table.Rows.Count * 40 + 50 > 300 ? 300
        : (table.Rows.Count * 40 + 50)));
    TableGrid.MinimumSize = new Size(GridPanel.Width - 20, 62);
    TableGrid.MaximumSize = new Size(GridPanel.Width - 20, 300);
    TableGrid.ScrollBars = ScrollBars.Both;
    TableGrid.AllowUserToAddRows = false;
    TableGrid.Location = new Point(0, Offset);
    TableGrid.DataSource = table;

    GridPanel.Controls.Add(TableGrid);

    Offset += TableGrid.Height;
}
}
MessageBox.Show(RowCount.ToString());