日期的 for 循环生成空白 space

Blank space being produced from for loop for dates

我有一个循环遍历两个选定日期之间的每个日期。

它会在该日期为每个产品创建一个面板,然后继续。

效果很好,但如果我再次 运行 循环,它会在新面板和旧面板之间产生一个空白 space。这是一个例子:

(我屏幕小的小原因)

黑线表示我在说什么。短的是每个面板之间的正常间距,长的表示我何时 运行 再次循环。

我担心的原因是,如果您想在初次添加后添加产品,那将是第二次、第三次或第四次循环 运行s 并留下那个间隙,这只会产生一个不愉快的景色。

有人能告诉我是什么导致了这个差距,这是这部分的代码(我知道 SQL 注入,我确实将参数发送到 DAL 但为了这个问题我我正在使用 SQL 查询):

for (DateTime date = dtpSDate.Value; date.Date <= dtpCDate.Value; date = date.AddDays(1))
{
     pnlReport.Controls.Add(new Label { Text = date.ToString(), Height = 20, Width = 150, Name = date.ToString(), Location = new Point(20, globalY), Font = new Font("Arial", 10, FontStyle.Bold) });
     globalY += 30;
     foreach (DataRowView lstvItem in chkListProducts.CheckedItems)
     {
           DataTable ProdTmp2 = new DataTable();
           string sqlP2 = "SELECT * FROM Product WHERE ProdID = '" + lstvItem[this.chkListProducts.ValueMember] + "'";
           ProdTmp2 = db.GetDataTable(sqlP2);

           if (Side == "Left")
           {
                Panel pnltmp = new Panel();
                pnltmp.Size = new Size(472, 120);
                pnltmp.Location = new Point(5, globalY);
                pnltmp.BackColor = Color.Green;
                pnltmp.Name = ProdTmp2.Rows[0][1].ToString();
                Label l = new Label();
                l.Text = ProdTmp2.Rows[0][1].ToString();
                l.Location = new Point(5, 5);
                pnltmp.Controls.Add(l);
                pnlReport.Controls.Add(pnltmp);
                Side = "Right";
                last = ProdTmp2.Rows[0][1].ToString();
           }
           else
           {
                Panel pnltmp = new Panel();
                pnltmp.Size = new Size(472, 120);
                pnltmp.Location = new Point(487, globalY);
                pnltmp.BackColor = Color.Red;
                pnltmp.Name = ProdTmp2.Rows[0][1].ToString();
                Label l = new Label();
                l.Text = ProdTmp2.Rows[0][1].ToString();
                l.Location = new Point(5, 5);
                pnltmp.Controls.Add(l);
                pnlReport.Controls.Add(pnltmp);
                Side = "Left";
                globalY += 140;
                last = ProdTmp2.Rows[0][1].ToString();
            }
     }

     if (Side == "Right")
     {
          Side = "Left";
                globalY += 170;
     }                
}

额外信息:日期差距越大。空白越大space差距。

所以最后的代码看起来像这样,space 现在不存在了。 感谢大家。

private void AddProducts()
    {
        foreach (Panel p in pnlReport.Controls.OfType<Panel>())
        {
            if (p.Name == last)
            {
                globalY = p.Location.Y + 140;
            }
        }

        for (DateTime date = dtpSDate.Value; date.Date <= dtpCDate.Value; date = date.AddDays(1))
        {
            pnlReport.Controls.Add(new Label { Text = date.ToString(), Height = 20, Width = 150, Name = date.ToString(), Location = new Point(20, globalY), Font = new Font("Arial", 10, FontStyle.Bold) });
            globalY += 30;
            foreach (DataRowView lstvItem in chkListProducts.CheckedItems)
            {
                string table = "";
                string select = "";
                if (Regex.IsMatch(lstvItem[this.chkListProducts.DisplayMember].ToString(), @"^[a-hA-H]"))
                {
                    table = "ProductHistoryAH";
                }
                else if (Regex.IsMatch(lstvItem[this.chkListProducts.DisplayMember].ToString(), @"^[i-qI-Q]"))
                {
                    table = "ProductHistoryIQ";
                }
                else if (Regex.IsMatch(lstvItem[this.chkListProducts.DisplayMember].ToString(), @"^[r-zR-Z]"))
                {
                    table = "ProductHistoryRZ";
                }

                DataTable ProdTmp1 = new DataTable();
                string sqlP1 = "SELECT * FROM " + table + " WHERE ProdID = '" + lstvItem[this.chkListProducts.ValueMember] + "' AND ProdHDate = '" + date.ToString(@"yyyy\/MM\/dd") + "'";
                ProdTmp1 = db.GetDataTable(sqlP1);

                DataTable ProdTmp2 = new DataTable();
                string sqlP2 = "SELECT * FROM Product WHERE ProdID = '" + lstvItem[this.chkListProducts.ValueMember] + "'";
                ProdTmp2 = db.GetDataTable(sqlP2);

                if (Side == "Left")
                {
                    Panel pnltmp = new Panel();
                    pnltmp.Size = new Size(472, 120);
                    pnltmp.Location = new Point(5, globalY);
                    pnltmp.BackColor = Color.Green;
                    pnltmp.Name = ProdTmp2.Rows[0][1].ToString() + count.ToString();
                    //Name
                    Label lblName = new Label();
                    lblName.Text = lstvItem[this.chkListProducts.DisplayMember].ToString();
                    lblName.Location = new Point(5, 5);
                    pnltmp.Controls.Add(lblName);
                    int Location = 0;
                    //Count
                    if (chkPCount.Checked)
                    {
                        Label lblCount = new Label();
                        if(ProdTmp1.Rows.Count>0)
                        {
                            lblCount.Text = "Count: " + ProdTmp1.Rows[0][4].ToString();
                        }
                        else
                        {
                            lblCount.Text = "Count: 0";
                        }                            
                        lblCount.Location = new Point(17, 32);
                        pnltmp.Controls.Add(lblCount);
                    }                                              
                    pnlReport.Controls.Add(pnltmp);
                    Side = "Right";
                }
                else if(Side == "Right")
                {
                    Panel pnltmp = new Panel();
                    pnltmp.Size = new Size(472, 120);
                    pnltmp.Location = new Point(487, globalY);
                    pnltmp.BackColor = Color.Red;
                    pnltmp.Name = ProdTmp2.Rows[0][1].ToString() + count.ToString();
                    //Name
                    Label lblName = new Label();
                    lblName.Text = lstvItem[this.chkListProducts.DisplayMember].ToString();
                    lblName.Location = new Point(5, 5);
                    pnltmp.Controls.Add(lblName);
                    //Count
                    if (chkPCount.Checked)
                    {
                        Label lblCount = new Label();
                        if (ProdTmp1.Rows.Count > 0)
                        {
                            lblCount.Text = "Count: " + ProdTmp1.Rows[0][4].ToString();
                        }
                        else
                        {
                            lblCount.Text = "Count: 0";
                        }
                        lblCount.Location = new Point(17, 32);
                        pnltmp.Controls.Add(lblCount);
                    }                        
                    pnlReport.Controls.Add(pnltmp);
                    Side = "Left";
                    globalY += 140;                                         
                }
                last = ProdTmp2.Rows[0][1].ToString() + count.ToString();
            }
            if (Side == "Right")
            {
                Side = "Left";
                globalY += 140;
            }          
        }
        count++;
    }

和输出: