场景:我正在使用来自数据库的数据加载DataGridView,所以为了做到这一点,我正在使用foreach循环,现在问题是当第二次进入DataGridView时它会加载之前的数据和数据现在循环。
为了解决这个问题,我做了这个:
private void ViewAvailProd_Btn_Click(object sender, EventArgs e)
{
int numRows = AvailProd_DGV.RowCount;
foreach (TBL_Product prod in DataLProducts.GetProducts())
{
if (numRows > 1)
{
AvailProd_DGV.Rows.Clear();
}
AvailProd_DGV.Rows.Add(prod.ProductID, prod.Name, prod.Category, prod.Price, prod.Stock, "Purchase");
}
this.PNL_ViewAvailProd.Visible = true;
}
但是,出现了另一个问题:它是这样做的:
之前;
如果我然后输入以下代码:
private void ViewAvailProd_Btn_Click(object sender, EventArgs e)
{
AvailProd_DGV.Rows.Clear();
foreach (TBL_Product prod in DataLProducts.GetProducts())
{
AvailProd_DGV.Rows.Add(prod.ProductID, prod.Name, prod.Category, prod.Price, prod.Stock, "Purchase");
}
this.PNL_ViewAvailProd.Visible = true;
}
这将是输出:
之前;
在方法的开头检查你的rowcount,结果> 1,所以每次在循环中执行if时,它将清除所有行,只添加一行。要解决此问题,只需清除方法开头的所有行,然后再将它们全部加载。像这样:
private void ViewAvailProd_Btn_Click(object sender, EventArgs e)
{
AvailProd_DGV.Rows.Clear();
foreach (TBL_Product prod in DataLProducts.GetProducts())
{
AvailProd_DGV.Rows.Add(prod.ProductID, prod.Name, prod.Category, prod.Price, prod.Stock, "Purchase");
}
this.PNL_ViewAvailProd.Visible = true;
}
编辑重建如果我为这个方法加载我自己的测试代码,它似乎工作得很好。
public List<Product> GetProducts()
{
List<Product> list = new List<Product>();
list.Add(new Product() { Id = 0, Name = "Fnatic", Category = "eSports", Price = 1000000, Stock = 1 });
list.Add(new Product() { Id = 1, Name = "G2", Category = "eSports", Price = 500000, Stock = 4 });
list.Add(new Product() { Id = 2, Name = "SKT", Category = "eSports", Price = 2000000, Stock = 0 });
list.Add(new Product() { Id = 3, Name = "Roccat", Category = "eSports", Price = 150000, Stock = 17 });
return list;
}
private void ViewButton_Click(object sender, EventArgs e)
{
dataGridView.Rows.Clear();
foreach (var product in GetProducts())
{
dataGridView.Rows.Add(product.Id, product.Name, product.Category, product.Price, product.Stock, "Purchase");
}
}