如何过滤/选择性地将值从一个DataGridView复制到另一个DataGridView

时间:2013-05-20 06:38:28

标签: c# datagridview filter

我有2个DataGridViews: productsDataGridView promotionsDataGridView

第一个 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”的复选框列(列提升从文件中读取整数值):如果它的值为0 - 如果选中大于1:则不选中该框。 现在我想做的是过滤/移动(我不关心两者中的哪一个)从 productsDataGridView promotionsDataGridView 的值我们在复选框列(促销)中有一个&gt; 0值。

enter image description here

示例: 如果productsDataGridView有25个总产品,其中8个是促销产品(在复选框列中值> 0),promotionDataGridView应该填充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]&gt; 0)但我是DataGridView的新手所以我只是写不出任何会甚至可以编译...

请帮帮我!

1 个答案:

答案 0 :(得分: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; 

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