1

我有 2 个 DataGridView:productsDataGridViewPromotionsDataGridView

第一个是productsDataGridView ,它使用此方法从文件中读取所有值:

public static List<Products> LoadUserListFromFile(string filePath)
{
    var loadProductsData = new List<Products>();

    foreach (var line in File.ReadAllLines(filePath))
    {
        var columns = line.Split('\t');
        loadProductsData.Add(new Products
        {
            InventoryID = "BG" + columns[0],
            Brand = columns[1],
            Category = columns[2],
            Description = columns[3],
            Promotions = Convert.ToInt32(columns[4]),
            Quantity = Convert.ToInt32(columns[5]),
            Price = Convert.ToDouble(columns[6])
        });
    }

    return loadProductsData;
}

第一个 DataGridView ( productsDataGridView ) 正确填充了所有值。现在在我的productsDataGridView中,我设置了一个名为“Promotion”的复选框列(Promotion 列从文件中读取整数值):如果它的值为 0 - 不选中该框,如果大于 1:选中。现在我想做的是过滤/移动(我不关心两者中的哪一个)从productsDataGridViewpromotionsDataGridView的值,我们在复选框列(促销)中有一个> 0的值。

在此处输入图像描述

示例: 如果 productsDataGridView 共有 25 个产品,其中 8 个是促销产品(复选框列中的值 >0),promotionsDataGridView 应该填充 8 个值,这些值是从 DataGridView 复制/移动/过滤/任何内容。

到目前为止,我只能使用以下代码将数据从第一个 DataGridView 复制到第二个:

public void Experimental2()
{
    dataGridView1.DataSource = Products.LoadUserListFromFile(filePath);
    //Bind datagridview to linq 
    var dg1 =
        (from a in productsDataGridView.Rows.Cast<DataGridViewRow>()
         select new { Column1 = a.Cells["Column1"].Value.ToString() }).ToList();

    //loop dg1 and save it to datagridview2
    foreach (var b in dg1)
    {
        dataGridView1.Rows.Add(b.Column1);
    }
}

我做了一些可怜的尝试来插入一个 IF 检查,这将为我完成这项工作(仅复制 IF columnt[4] > 0)但我对 DataGridView 真的很陌生,所以我无法编写任何甚至可以编译的东西...

请帮我!

4

1 回答 1

1

如果两个网格具有相同的模式(我假设它们具有),那么我们将找到检查了哪些行,将产品绑定到给定行,创建新结果列表并将其绑定到下一个网格。

var results = new List<Products>(); //our new data source with only checked items

foreach (DataGridViewRow row in productsDataGridView.Rows)
{
    var item = row.DataBoundItem as Products; //get product from row (only when grid is databound!)

    if (item.Promotions > 0)
    {
        results.Add(item);        
    }
}

promotionsDataGridView.DataSource = results; 

如果要从第一个网格中删除已检查的行,则创建临时行列表,将已检查的行添加到其中,最后遍历它们并逐个删除。希望能帮到你:)

于 2013-05-20T06:49:24.793 回答