Проблема 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.