我有一个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;
}
});
这会产生一个聚合异常。 如何快速执行此任务
答案 0 :(得分:1)
永远记住一件事(或者至少对于Windows Forms :-)) - UI是单线程的,你不能使用多线程技术“优化”它,包括并行扩展。
执行更新任务的最快方法是更新数据,并让UI显示您的操作。幸运的是,你有一个数据源,所以在数据源上应用操作(这里你可以使用简单的for
或Parallel.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; }
}
}