日期的 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++;
}
和输出:
我有一个循环遍历两个选定日期之间的每个日期。
它会在该日期为每个产品创建一个面板,然后继续。
效果很好,但如果我再次 运行 循环,它会在新面板和旧面板之间产生一个空白 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++;
}
和输出: