繁体   English   中英

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

[英]How to run Run CellEndEdit only when Cell ValueChanged in DataGridView

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

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

在CellValidation情况下,细胞验证事件不会返回,但也CellEndEdit被执行和更新, updated dateby字段时,用户只已经进入编辑模式就出来了,而不改变值单元格。
到达CellEndEdit时, CellValueFormatted Value是相同的,因此无法将其放入CellEndEdit中。

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM