![](/img/trans.png)
[英]How to Trigger DataGridView CellEndEdit When A Cell Value Changes Programmatically
[英]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 date
及by
字段时,用户只已经进入编辑模式就出来了,而不改变值单元格。
到达CellEndEdit时, CellValue
和Formatted 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.