C# 如何仅在DataGridView中的单元格值更改时运行CellEndEdit
我只想在单元格的值更改时运行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也会执行并更新,更新日期&由字段,当用户仅进入编辑模式并且出来时,没有更改单元格的值。 当到达
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”事件在窗体/控件构造函数中调用。这样就不必维护变量。