我有一个绑定到dataSource的datagridview,并在加载表单时更新。 datagridview还包含一个未绑定的列 subTotal ,它将一行中的3个值相乘。 dataSource的绑定工作正常,DGV与未绑定列的值一起正确更新。但是,在 Form_Load 事件完成后,程序会自动删除我的DGV中的所有行,并将我的DataSource中的所有项重新添加到DGV中。我的问题是在重新添加行之后,仅为前两行更新了subTotal列,并将下一行的 subTotal 列值设置为null。我的测试用例包含一个包含2行以上的DataTable,无论我有多少行,都只计算前2行的subTotal。
有人能为我提供一个可能的解决方案,并解释为什么程序会自动删除并重新添加绑定行到datagridview,为什么只计算前两行?我已经工作了好几个小时,仍然无法找到解决问题的方法。
谢谢!
以下是我的代码:
private void ShowSalesOrderWindow_Load(object sender, EventArgs e)
{
CreateItemsTable();
itemsDataGridView.AutoGenerateColumns = true;
itemsDataGridView.DataSource = itemTable;
CreateSubTotalColumn();
GenerateItemsDataTable();
}
private void CreateSubTotalColumn()
{
DataGridViewColumn subTotalCol =
new DataGridViewTextBoxColumn();
subTotalCol.Name = "subTotalCol";
subTotalCol.HeaderText = "Sub-Total";
subTotalCol.ReadOnly = true;
itemsDataGridView.Columns.Insert(4, subTotalCol);
}
private void GenerateItemDataTable()
{
foreach (SalesOrderItem soi in salesOrder.SalesOrderItems)
{
DataRow row = itemTable.NewRow();
row["Product Code"] = soi.Product.ProductCode;
row["Quantity"] = soi.Quantity;
row["Price"] = soi.Price;
row["Discount"] = soi.Discount;
itemTable.Rows.Add(row);
}
}
private void itemsDataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
DataGridViewRow row = itemsDataGridView.Rows[e.RowIndex];
row.Cells["subTotalCol"].Value = ComputeRowSubTotal(row).ToString("c");
}
我还为RowsRemoved事件创建了一个空事件处理程序,只是为了添加一个断点并查看它是否进入它。
答案 0 :(得分:1)
RowsAdded
后,可能会触发{p> DataGridView
(顾名思义)。在传递给方法的事件args中,您拥有属性RowCount
以查看此事件刚被触发的行数。
试试这段代码:
private void itemsDataGridView_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
if (e.RowIndex == -1 || e.RowCount == 0)
{
return;
}
for (int i = 0; i < e.RowCount; i++)
{
var index = e.RowIndex + i; //get row index
DataGridViewRow row = itemsDataGridView.Rows[index];
row.Cells["subTotalCol"].Value = ComputeRowSubTotal(row).ToString("c");
}
}