DataGridView RowsRemoved和RowsAdded自动触发

时间:2013-11-20 08:26:49

标签: c# winforms data-binding datagridview

我有一个绑定到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事件创建了一个空事件处理程序,只是为了添加一个断点并查看它是否进入它。

1 个答案:

答案 0 :(得分:1)

将x行添加到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");
    }
}