Проблема DataGridView - вычисленное значение столбца изначально не отображается в DataGridView

Я разрабатываю приложение Windows Forms с использованием С#,.Net 4.5, Entity Frameworks 6.1

Я использую следующий код для заполнения элемента управления DataGridView.

var context = new MyVisionBidModelEntities();

bidItemMaterialBindingSource.DataSource = 
 context.BidItemMaterials.Where(c => c.BidItemID == selectedItem.BidItemID).ToList();

dataGridView1.DataSource = bidItemMaterialBindingSource;

Затем я устанавливаю значение столбца "TotalPrice", используя следующий код.

foreach (DataGridViewRow row in dataGridView1.Rows.Cast<datagridviewrow>().Where(row => !row.IsNewRow))
{
 CalculateTotalPrice(row);
}

private void CalculateTotalPrice(DataGridViewRow row)
{
 object a = row.Cells[1].Value;
 object b = row.Cells[2].Value;
 object c = row.Cells[3].Value;
 ****** aNumber = 0;
 ****** bNumber = 0;
 ****** cNumber = 0;
 if (a != null)
 aNumber = ******.Parse(a.ToString());
 if (b != null)
 bNumber = ******.Parse(b.ToString());
 if (c != null)
 cNumber = ******.Parse(c.ToString());
 row.Cells["TotalPrice"].Value = aNumber * bNumber * cNumber;
 row.Cells["TotalPrice"].ValueType = typeof(******);
}
</datagridviewrow>

Когда я изначально просматриваю элемент управления DataGridView, все строки и столбцы доступны для просмотра, однако в столбце TotalPrice есть значения Null.

Когда я повторно использую код выше, DataGridView теперь имеет значения TotalPrice.

Я попытался сделать DataGridView.Refresh, DataGridView.Update и т.д. Но вы не можете заставить Calculated Column отображаться на начальном этапе. Он отлично работает на второй краске.

Я что-то упускаю?

2 ответа

Если столбец TotalPrice не привязан, я бы сделал его виртуальным столбцом и выполнил CellValueNeeded событии DataGrid CellValueNeeded, в противном случае выполните расчет до того, как вы установите свойство DataGrid DataSource. Есть еще некоторые подробности, которые могут вам понадобиться для тренировки в зависимости от того, как ваши пользователи будут использовать сетку, но это должно заставить вас двигаться в правильном направлении.


на первой краске все строки представляют собой новые строки... подумайте о том, как изменить свой оператор foreach.

по просьбе кого-то другого, здесь код изменился для вас/сделанный для вас:

Измените этот блок:

foreach (DataGridViewRow row in dataGridView1.Rows.Cast<datagridviewrow>().Where(row => !row.IsNewRow))
{
 CalculateTotalPrice(row);
}
</datagridviewrow>

для этого блока:

foreach (DataGridViewRow row in dataGridView1.Rows)
{
 CalculateTotalPrice(row);
}

licensed under cc by-sa 3.0 with attribution.