C# TableLayoutPanel不显示最后10行数据

C# TableLayoutPanel不显示最后10行数据,c#,winforms,ms-access,tablelayoutpanel,C#,Winforms,Ms Access,Tablelayoutpanel,我需要创建一个表,它将始终在TableLayoutPanel上显示CTLog的最后十条记录。因此,每当用户通过单击按钮在Access数据库中添加新的CTLog时,表将动态更新并显示最后十个CTLog。当添加前十条记录时,我设法将它们放在表中,但在第十行之后添加的记录无法显示。我使用了在TableLayoutPanel上替换旧标签的方法,擦除旧标签,然后添加新标签 private void RecentCT() { int j = 0; for (j = 0

我需要创建一个表,它将始终在TableLayoutPanel上显示CTLog的最后十条记录。因此,每当用户通过单击按钮在Access数据库中添加新的CTLog时,表将动态更新并显示最后十个CTLog。当添加前十条记录时,我设法将它们放在表中,但在第十行之后添加的记录无法显示。我使用了在TableLayoutPanel上替换旧标签的方法,擦除旧标签,然后添加新标签

private void RecentCT()
    {
        int j = 0;
        for (j = 0; j < 10; j++)
        {
            tableLayoutPanel1.Controls.Remove(tableLayoutPanel1.GetControlFromPosition(j + 1, 0));
            tableLayoutPanel1.Controls.Remove(tableLayoutPanel1.GetControlFromPosition(j + 1, 1));
        }

        string sql = "select Top 10 * from timer where ModelLog = @m and ShiftLog = @sl and ShiftStart = @ss and ShiftEnd = @se";

        using (OleDbCommand cmd = new OleDbCommand(sql, connection))
        {
            //all cmd.Parameters.Add actions at here
            
            try
            {
                connection.Open();
                //List<string> results = new List<string>(); I used list and foreach previously
                Label[] labels = new Label[10];
                Label[] labels2 = new Label[10];
                int i = 0;
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {                           
                             labels[i] = new Label
                            {
                                Text = reader["CTLog"].ToString(),
                                Anchor = AnchorStyles.None,
                                Font = new Font("Microsoft Sans Serif", 10, FontStyle.Regular),
                                TextAlign = ContentAlignment.MiddleCenter
                            };
                            labels2[i] = new Label
                            { 
                                Text = "Unit " + reader["UnitID"].ToString(),
                                Anchor = AnchorStyles.None,
                                Font = new Font("Microsoft Sans Serif", 10, FontStyle.Regular),
                                TextAlign = ContentAlignment.MiddleCenter
                            };
                            tableLayoutPanel1.Controls.Add(labels2[i], i + 1, 0);
                            tableLayoutPanel1.Controls.Add(labels[i], i + 1, 1);
                            i++;
                    }
                }
                connection.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Recent cycle time records cannot be retrieved. Error: " + ex.Message);
                connection.Close();
            }

        }
    }
private void RecentCT()
{
int j=0;
对于(j=0;j<10;j++)
{
tableLayoutPanel1.Controls.Remove(tableLayoutPanel1.GetControlFromPosition(j+1,0));
tableLayoutPanel1.Controls.Remove(tableLayoutPanel1.GetControlFromPosition(j+1,1));
}
string sql=“从计时器中选择前10个*,其中ModelLog=@m和ShiftLog=@sl和ShiftStart=@ss和ShiftEnd=@se”;
使用(OleDbCommand cmd=新的OleDbCommand(sql,连接))
{
//在此处添加所有cmd.Parameters.Add操作
尝试
{
connection.Open();
//List results=new List();我以前使用过List和foreach
标签[]标签=新标签[10];
标签[]标签2=新标签[10];
int i=0;
使用(var reader=cmd.ExecuteReader())
{
while(reader.Read())
{                           
标签[i]=新标签
{
Text=reader[“CTLog”].ToString(),
锚点=锚点样式。无,
Font=新字体(“Microsoft Sans Serif”,10,FontStyle.Regular),
TextAlign=ContentAlignment.MiddleCenter
};
标签2[i]=新标签
{ 
Text=“Unit”+读卡器[“UnitID”].ToString(),
锚点=锚点样式。无,
Font=新字体(“Microsoft Sans Serif”,10,FontStyle.Regular),
TextAlign=ContentAlignment.MiddleCenter
};
tableLayoutPanel1.Controls.Add(标签2[i],i+1,0);
tableLayoutPanel1.Controls.Add(标签[i],i+1,1);
i++;
}
}
connection.Close();
}
捕获(例外情况除外)
{
MessageBox.Show(“无法检索最近的周期时间记录。错误:”+ex.Message);
connection.Close();
}
}
}

我的方法是否遗漏了什么或有什么错误?

问题在于我使用的sql查询。 这是正确的sql查询:

string sql = "select top 10 * from timer where ModelLog = @m and ShiftLog = @sl and ShiftStart = @ss and ShiftEnd = @se ORDER BY ID DESC";

要获取最新的10行记录,我必须在查询中以desc形式将top和orderby组合在一起。因为只使用top关键字只会得到前10行,而不是最后10行。

这是DataGridView的工作。去掉LayoutPanel。这是垃圾。我尝试了很多次,但是布局面板中的属性非常有限,并且经常不起作用。通过创建主面板并将子面板添加到主面板,可以更轻松地创建自己的LayoutPanel。单独滚动每个子面板的工作方式如下,而不是在LayoutPanel中。