确定何时更改DataGridView中的单元格,但仅在退出编辑模式后

时间:2018-10-16 07:07:37

标签: c# datagridview cell

我已经阅读了有关此主题的几篇文章,但似乎都没有适合我的实际情况。我基本上想执行一些代码来在用户进行任何更改后从DataGridView单元复制数据。但特别是,我只想在用户完成单元格的编辑之后以及单元格的值实际上不同时(例如,用户没有取消编辑)来获取值。我要寻找的行为与Excel仅在用户实际更新了单元格的公式之后才更新单元格的公式相同。到目前为止,这是我开始使用的代码:

private void MyDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    // Exit this event procedure if no rows have been added to the DataGridView yet (during program initialization)
    if (e.RowIndex < 0)
    {
        return;
    }

    // Get an object reference to the current Value cell
    DataGridViewCell cell = (DataGridViewCell)MyDataGridView.Rows[e.RowIndex].Cells[1];

    // Do other stuff with the cell data here   
}

private void MyDataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
    // Force the CellValueChanged event to trigger for the control if the current cell's value has changed
    if (MyDataGridView.IsCurrentCellDirty)
    {
        MyDataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
}

它的工作原理是,每次进行编辑时都会触发CellValueChanged事件。但是,该事件在用户在编辑模式下每次键入键时都会触发,而我只想在用户退出编辑模式后触发一次(并假设已进行更改并且未取消)。解决此问题的最佳方法是什么?我还查看了CellEndEdit事件,这似乎使我更加接近了,但是我仍然无法确定是提交还是取消了编辑。最好/推荐的方法是什么?

1 个答案:

答案 0 :(得分:0)

好的,大家好,我找到了解决问题的简单方法。为了使它起作用,您所需要做的就是使用CellBeginEdit和CellEndEdit事件。我创建了一个名为CellValue的全局变量,该变量设置为CellBeginEdit事件中单元格的内容。稍后,在CellEndEdit事件中对照该单元格的当前值检查此存储的值。如果它们不同,那么我可以执行处理单元中新更改的数据所需的代码。

我知道这种方法可能无法在每种情况下都适用,但只是以为我会与遇到相同问题的其他任何人分享。这是一个快速的代码示例,说明了我的工作:

// Temporarily holds the value of a cell in the DataGridView once a cell has begun to be edited.
// The value in this variable is then compared to the value of the cell after the edit is complete to see if the data chagned before updating the controlParameters object
object CellValue;

private void MyDataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    // Set this variable to the current cell's value to compare later to see if it's contents have changed
    this.CellValue = MyDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
}

private void MyDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
    // Exit this event procedure if no rows have been added to the DataGridView yet (during program initialization)
    if (e.RowIndex < 0)
    {
        return;
    }

    // Proceed only if the value in the current cell has been changed since it went into edit mode
    if (this.CellValue != MyDataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value)
    {
        // Do your cell data manipulation here
    }
}