我只想在更改单元格的值时运行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个旗帜?
答案 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个小时来实现这一目标,因为没有人有解决方案,所以我认为这可能对其他人有用