首页 文章

DataGridView RowsRemoved和RowsAdded自动触发

提问于
浏览
0

我有一个绑定到dataSource的datagridview,并在加载表单时更新 . datagridview还包含一个未绑定的列 subTotal ,它将一行中的3个值相乘 . dataSource的绑定工作正常,DGV与未绑定列的值一起正确更新 . 但是,在 Form_Load 事件完成后,程序会自动删除我的DGV中的所有行,并将我的DataSource中的所有项重新添加到DGV中 . 我的问题是在重新添加行之后,仅为前2行更新了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 回答

  • 1

    将_行添加到 DataGridView 之后可能会触发 RowsAdded (顾名思义) . 在传递给方法的事件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");
        }
    }
    

相关问题