C# 如何仅在DataGridView中的单元格值更改时运行CellEndEdit

C# 如何仅在DataGridView中的单元格值更改时运行CellEndEdit,c#,.net,winforms,validation,datagridview,C#,.net,Winforms,Validation,Datagridview,我只想在单元格的值更改时运行CellEndEdit,并尝试放置 if (dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == e.FormattedValue.ToString()) return; 在CellValidation事件中,单元格验证事件确实返回,但CellEndEdit也会执行并更新,更新日期&由字段,当用户仅进入编辑模式并且出来时,没有更改单元格的值。 当到达

我只想在单元格的值更改时运行CellEndEdit,并尝试放置

if (dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == e.FormattedValue.ToString()) 
             return; 
在CellValidation事件中,单元格验证事件确实返回,但CellEndEdit也会执行并更新,
更新日期
&
字段,当用户仅进入编辑模式并且出来时,没有更改单元格的值。
当到达CellEndEdit时,
CellValue
格式值
是相同的,因此无法将其放入CellEndEdit中。


一个简单的解决方案是在CellValidation中设置一个标志,并在设置标志时返回CellEndEdit,但这似乎是一个容易出错的解决方案,因为表单上大约有10个网格。因此,10个标志?

您完全可以通过在
CellBeginEdit
中捕获当前单元格值,然后将其与
CellEndEdit
中的当前单元格值进行比较来达到目的。(或者使用您的
cellvalization
技巧。)


为了避免“多个标志”,您可以使用
字典
,这样您就可以使用当前事件的网格输入字典,然后获取或设置适当的值。

而不是在CellEndEdit中执行任务,而是将它们放在CellValueChanged中。仅当单元格值发生更改时才会触发。请注意,它将在最初填充DataGridView时触发,但要处理这个问题,您可以只放置一个变量formInitialized或其他内容,以确保在填充数据网格时没有执行CellEndEdit


为了回答您的问题,无法确定在触发CellEndEdit时值是否发生了更改,因为当cell退出编辑模式时,它总是被触发。唯一的解决方案是,像您建议的那样,将旧值存储在外部,但您已经注意到了为什么会如此糟糕(尽管它在大多数情况下都非常有效)。

但是如果您想计算编辑的值,您可以使用J.Fisher建议的问题,如:

Private Sub dgvHost_CellBeginEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles dgvHost.CellBeginEdit
    dgvHost.CurrentCell.Tag = dgvHost.CurrentCell.Value
End Sub

Private Sub dgvHost_CellEndEdit(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgvHost.CellEndEdit
    If dgvHost.CurrentCell.Tag = dgvHost.CurrentCell.Value Then Exit Sub
    dgvHost.CurrentCell.Tag = Nothing
    'Do something like
    dgvHost.CurrentCell.Value = MD5(dgvHost.CurrentCell.Value)
End Sub
我是这样做的:

C#:

private void DynList_RowValidated(object sender, DataGridViewCellEventArgs e)
{
    if (ChangedRow == true) {
        ChangedRow = false;
        //Row Changed...
    }

}
bool ChangedRow;
private void DynList_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    ChangedRow = true;
}
 Private Sub DynList_RowValidated(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
        If ChangedRow = True Then
            ChangedRow = False
            'Row Changed...
        End If

 End Sub
 Dim ChangedRow As Boolean
 Private Sub DynList_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
        ChangedRow = True
 End Sub
VB.Net:

private void DynList_RowValidated(object sender, DataGridViewCellEventArgs e)
{
    if (ChangedRow == true) {
        ChangedRow = false;
        //Row Changed...
    }

}
bool ChangedRow;
private void DynList_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    ChangedRow = true;
}
 Private Sub DynList_RowValidated(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
        If ChangedRow = True Then
            ChangedRow = False
            'Row Changed...
        End If

 End Sub
 Dim ChangedRow As Boolean
 Private Sub DynList_CellValueChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs)
        ChangedRow = True
 End Sub

我花了1个小时的时间对此进行归档,因为没有人有解决方案,所以我认为这可能对其他人有用

好答案,为了避免维护变量“formInitialized”,可以在“this.InitializeComponent();”之后连接“CellValueChanged”事件在窗体/控件构造函数中调用。这样就不必维护变量。