Это уже упоминалось в документации :
Событие CellFormatting происходит каждый раз, когда каждая ячейка окрашивается, поэтому при обработке этого события следует избегать длительной обработки.Это событие также происходит, когда извлекается ячейка FormattedValue или вызывается ее метод GetFormattedValue.
Обработка CellFormatting
для всех ячеек слишком велика для вычисления Sum
.
Если вы используете DataSource
подобно DataTable
, которое вызывает событие ListChanged
, для вычисления Sum
вы можете положиться на событие ListChanged
.
В качестве другого вариантаможно рассчитывать на RowsAdded
, RowsRemoved
и CellValueChanged
событие DataGridView
для вычисления Sum
.
Пример - DataTable - сумма столбца
DataTable
вызывает ListChange
событие.Вы можете подписаться на событие для обновления текстового поля:
private async void Form1_Load(object sender, EventArgs e)
{
// Define data table
var dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Price", typeof(int));
// Fill data
dt.Rows.Add("Product 1", 100);
dt.Rows.Add("Product 2", 200);
// Set data source of data grid view
this.dataGridView1.DataSource = dt;
// Automatically update text box, by SUM of price
textBox1.Text = $"{dt.Compute("SUM(Price)", ""):F2}";
dt.DefaultView.ListChanged += (obj, args) =>
textBox1.Text = $"{dt.Compute("SUM(Price)", ""):F2}";
}
Пример - Список - Сумма свойства
List<T>
неподнять ListChanged
событие.Вы можете использовать BindingSource
в качестве источника данных и обрабатывать ListChanged
событие BindingSource
вместо:
public class Product
{
public string Name { get; set; }
public int Price { get; set; }
}
private async void Form1_Load(object sender, EventArgs e)
{
// Define list
var list = new List<Product>();
// Fill data
list.Add(new Product { Name = "Product 1", Price = 100 });
list.Add(new Product { Name = "Product 2", Price = 200 });
// Set data source of data grid view
var bs = new BindingSource();
bs.DataSource = list;
this.dataGridView1.DataSource = bs;
// Automatically update text box, by SUM of price
textBox1.Text = $"{list.Sum(x => x.Price):F2}";
bs.ListChanged += (obj, args) =>
textBox1.Text = $"{list.Sum(x => x.Price):F2}";
}