循环 arraylist 并在 datagridView 中显示,C# Winform

Looping arraylist and display in datagridView , C# Winform

我有一些 productID 作为 字符串 用逗号让变量 products"10,11,12" 我把它们分开

string[] productlist = products.Split(',');

但是当我想在 datagridview 中显示这些产品的名称时,我只得到最后一个。不是所有三个产品。

这是我的代码:

foreach (var item in productlist)
{
                         
    int Pid = Convert.ToInt32(item);

    var pro = (from u in db.Product
               where u.ProductId == Pid
               select new
               {
                 Productname = u.ProductNamn
               }).Tolist();
            dgvProduct.DataSource = pro;

 }

我的代码应该是什么样的?我知道我循环的时候有问题,但是我不知道怎么解决。

非常感谢你们的帮助,提前谢谢你们

我的猜测是:

如果 productList 中有三个项目,则 foreach 将 运行 三次,每个项目一个。

当它在 db.Product 中找到 product 时,它会调用

dgvProduct.DataSource = pro;

其中 pro 是与第一项相关的 product。但是随后找到了第二个项目,并且该行再次被称为

dgvProduct.DataSource = pro;

但现在是第二个 product。最后检索到第三项(最后一项)并且

dgvProduct.DataSource = pro;

所以最后你覆盖了dgvProduct.DataSource = pro,当然最后一个是剩下的...

虽然不确定它是否有效,但我会做的是制作一个包含所有产品的集合,然后将该集合设置为 dgvProduct.DataSource。也许像

var pro = (from u in db.Product
    where productlist.Contains(u.ProductId.ToString())
    select new
    {
        Productname = u.ProductNamn
    }).Tolist();
dgvProduct.DataSource = pro;

您似乎在每次迭代时都覆盖了 dgvProduct.DataSource,这意味着最后一次迭代将是唯一有效的迭代。您可能只想在收集所有产品后在循环外设置 dgvProduct.DataSource。但是,这可以更有效地完成:

// 'Select(int.Parse)' is short for 'Select(strId => int.Parse(strId))'
var prodIds = productlist.Select(int.Parse).ToList();

var products =
    (from u in db.Product
     where prodIds.Contains(u.ProductId)
     select new
     {
         Productname = u.ProductNamn
     }).Tolist();
dgvProduct.DataSource = products;