如何在DataGridView中的Cell ValueChanged时运行CellEndEdit

时间:2012-01-17 17:54:54

标签: c# .net winforms validation datagridview

我只想在更改单元格的值时运行CellEndEdit,尝试使用

if (dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == e.FormattedValue.ToString()) 
             return; 

在CellValidation事件中,Cell Validation事件确实返回,但CellEndEdit也会被执行并更新,updated date&当用户进入编辑模式并且在不更改值单元格的情况下出现时,by个字段 到达CellEndEdit时CellValue& Formatted Value相同,因此无法将其放入CellEndEdit。

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

5 个答案:

答案 0 :(得分:13)

不要在CellEndEdit中执行任务,而是将它们放在CellValueChanged中。仅在更改单元格值时才会触发它。请注意,它会在最初填充DataGridViews时触发,但为了处理它,您可以只放置一个表示formInitialized的变量,以确保在填充数据网格时没有执行CellEndEdit。

要回答你的问题,没有办法弄清楚当CellEndEdit被触发时是否更改了值,因为当单元格退出编辑模式时它总是被触发。唯一的解决方案是,像你建议的那样,在外部存储旧值,但是你已经注意到为什么那么糟糕(尽管在大多数情况下它确实很好)。

答案 1 :(得分:0)

您可以通过捕获CellBeginEdit中的当前单元格值,然后将其与CellEndEdit中的当前单元格值进行比较来实现目标。 (或者使用你的CellValidation技巧。)

为避免“多个标记”,您可以使用Dictionary<DataGridView,object>,这样您就可以使用当前事件的网格键入字典,然后获取或设置适当的值。

答案 2 :(得分:0)

 MessageBox.Show(dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString());

答案 3 :(得分:0)

但是如果你想计算编辑的值,你可以使用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

答案 4 :(得分:0)

我这样做了:

<强> 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;
}

<强> VB.Net:

 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个小时来实现这一目标,因为没有人有解决方案,所以我认为这可能对其他人有用