如何在DataGridView中仅当单元格值更改时运行Run CellEndEdit?

7
我希望只有当单元格的值发生变化时才运行 CellEndEdit,我已经尝试将其放置在

标签中。

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

在CellValidation事件中,Cell Validation事件确实会返回,但是当用户仅进入编辑模式并退出而未更改单元格的值时,CellEndEdit也会被执行并更新“更新日期”和“由”字段。
当到达CellEndEdit时,“CellValue”和“Formatted Value”相同,因此无法将其放在CellEndEdit中。
一个微不足道的解决方案是在CellValidation中设置一个标志,并在设置标志后返回CellEndEdit,但这似乎是一个容易出错的解决方案,因为表单上有大约10个网格。所以需要10个标志吗?
5个回答

15

不要在CellEndEdit中执行任务,而是将其放置在CellValueChanged中。这只有在单元格值更改时才会触发。请注意,当你的DataGridViews最初填充时,它会触发,但为了处理它,你可以只放一个变量,比如formInitialized之类的东西,以确保在填充数据网格时不执行CellEndEdit。

回答你的问题,无法在触发CellEndEdit时确定值是否更改,因为它总是在单元格退出编辑模式时触发。唯一的解决方案就像你提出的那样,将旧值外部存储,但你已经注意到这为什么不好(尽管在大多数情况下效果非常好)。


3
为了避免维护变量"formInitialized",你可以在窗体/控件构造函数中的"this.InitializeComponent();"调用后连接"CellValueChanged"事件。这样你就不必维护该变量了。 - Joe.Net

3

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

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

我试了大约一个小时才实现这个,因为没有人有解决办法,所以我觉得对其他人可能有用。


0

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

为了避免“多个标志”,你可以使用一个 Dictionary<DataGridView,object>,这样你就可以使用当前事件的网格作为字典的键,然后获取或设置相应的值。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接