快速循环datagridview行的方法

时间:2015-11-10 09:37:38

标签: c# optimization datagridview

我有一个datagridview,其中包含一个价格超过1000行的列 我想对所有这些价格示例应用减少" -20%"

 product    price  
 product1    200
 product2    300
 product3    400
public class product
{
    public int ID {get;set;}
    public double Price {get;set;}
    public string Name {get;set;}
}
public List<product> GetListProduct()
{
       B_Entities dbCtx = new B_Entities();

        return dbCtx.B_PRODUCTS.Select(p => new Product{ ID= p.ID, Name= p.Name, Price= p.Price }).ToList();


}

dgvListeProd.DataSource = GetListProduct(); 

 Parallel.For(0, dgvListeProd.Rows.Count, index=>
            {
                  object priceValue = dgvListeProd.Rows[index].Cells[2].Value;

                if (priceValue != null)
                {
                    decimal price = Convert.ToDecimal(priceValue);
                    decimal countedPrice = (price * pourcentage) / 100;
                     countedPrice = price - countedPrice;

                    dgvListeProd.Rows[index].Cells[2].Value =(double) countedPrice;

                }
            });

这会产生一个聚合异常。 如何快速执行此任务

1 个答案:

答案 0 :(得分:1)

永远记住一件事(或者至少对于Windows Forms :-)) - UI是单线程的,你不能使用多线程技术“优化”它,包括并行扩展。

执行更新任务的最快方法是更新数据,并让UI显示您的操作。幸运的是,你有一个数据源,所以在数据源上应用操作(这里你可以使用简单的forParallel.For),然后只需调用DataGridView.Refresh

这是一个类似于您的案例的完整工作示例,它处理 1M 行没有任何问题:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Samples
{
    static class Program
    {
        static void ReducePrice(DataGridView productView, decimal percentage)
        {
            var factor = 1 - percentage / 100;
            var data = (List<Product>)productView.DataSource;
            Parallel.For(0, data.Count, index =>
            {
                var product = data[index];
                product.Price = (double)((decimal)product.Price * factor);
            });
            productView.Refresh();
        }
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            var form = new Form();
            var dg = new DataGridView { Dock = DockStyle.Fill, Parent = form };
            dg.DataSource = GetProductList();
            var button = new Button { Dock = DockStyle.Bottom, Parent = form, Text = "Reduce Price by 20%" };
            button.Click += (sender, e) => ReducePrice(dg, 20);
            Application.Run(form);
        }
        static List<Product> GetProductList()
        {
            var random = new Random();
            return Enumerable.Range(1, 1000000).Select(n => new Product { ID = n, Name = "Product#" + n, Price = random.Next(10, 1000) }).ToList();
        }
    }
    public class Product
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }
    }
}