DataGridView问题 - 计算的列值最初不会显示在DataGridView中

时间:2014-04-30 18:54:38

标签: c# .net winforms entity-framework datagridview

我正在使用C#,。Net 4.5,Entity Frameworks 6.1开发Windows窗体应用程序

我使用以下代码填充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;
    double aNumber = 0;
    double bNumber = 0;
    double cNumber = 0;
    if (a != null)
        aNumber = Double.Parse(a.ToString());
    if (b != null)
        bNumber = Double.Parse(b.ToString());
    if (c != null)
        cNumber = Double.Parse(c.ToString());
    row.Cells["TotalPrice"].Value = aNumber * bNumber * cNumber;
    row.Cells["TotalPrice"].ValueType = typeof(double);
}

当我最初查看DataGridView控件时,所有行和列都是可见的,但是,TotalPrice列具有空值。

当我重新执行上面的代码时,DataGridView现在具有TotalPrice值。

我已经尝试过做DataGridView.Refresh,DataGridView.Update等。但是不能让计算列最初显示出来。它在第二种涂料上工作正常。

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

如果您的TotalPrice列未绑定,我会将其设为虚拟列,并在dataGrid的CellValueNeeded事件中进行计算,否则在设置DataGrid的DataSource属性之前执行计算。根据用户使用网格的方式,您可能还需要更多细节,但这应该可以让您朝着正确的方向前进。

答案 1 :(得分:0)

在第一个画面上,所有行都是新行...考虑改变你的foreach语句。

根据其他人的要求,此处为您更改了代码/为您完成的工作:

更改此块:

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

这个块:

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