Похоже, ваш код пытается удалить новую пустую строку из базы данных - но ее еще нет в базе данных; он «отсоединен» и просто находится в памяти DataGridView ... вот где вам нужно его удалить. Вы можете сделать это с помощью строки в ваших событиях проверки, которые, конечно, будут (или должны) вызываться перед сохранением.
Один из способов справиться с этим - попросить пользователя полностью заполнить новую строку:
Private Sub dataGridView1_RowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs)
If dataGridView1.Rows(e.RowIndex) IsNot Nothing AndAlso Not dataGridView1.Rows(e.RowIndex).IsNewRow Then
Dim [error] As String = ""
If dataGridView1.Rows(e.RowIndex).Cells("Field1").Value Is Nothing OrElse dataGridView1.Rows(e.RowIndex).Cells("Field1").Value.ToString().Trim() = "" Then
[error] += " * Field #1" & vbLf
End If
If dataGridView1.Rows(e.RowIndex).Cells("Field2").Value Is Nothing OrElse dataGridView1.Rows(e.RowIndex).Cells("Field2").Value.ToString().Trim() = "" Then
[error] += " * Field #2" & vbLf
End If
If [error] <> "" Then
MessageBox.Show("The following required fields were left blank:" & vbLf & vbLf & [error], "Row Validation Error", MessageBoxButtons.OK, MessageBoxIcon.[Error])
e.Cancel = True
End If
End If
End Sub
Другой способ справиться с этим - удалить (пустую) строку из DataGridView:
Private Sub dataGridView1_RowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs)
If dataGridView1.Rows(e.RowIndex) IsNot Nothing AndAlso Not dataGridView1.Rows(e.RowIndex).IsNewRow Then
dataGridView1.Rows.Remove(e.RowIndex)
End If
End Sub
Третий популярный способ сделать это - отменить проверку текущей строки, когда ничего не сделано:
Private Sub dataGridView1_RowValidating(ByVal sender As Object, ByVal e As DataGridViewCellCancelEventArgs)
Dim drv As DataRowView = TryCast(dataGridView1.CurrentRow.DataBoundItem, DataRowView)
If drv IsNot Nothing AndAlso drv(0) = DBNull.Value Then
drv.CancelEdit()
e.Cancel = True
End If
End Sub
(Также, на заметку: если для вашего первичного ключа (a / k / a identity) установлено значение auto-number, вы можете обнаружить, что ADO.NET лучше справляется с деталями получения следующего идентификатора и тому подобное во время сохранения. Для получения дополнительной информации ознакомьтесь со статьей MSDN «Получение идентификатора значений автонумерации» и , которая представляет собой великолепный набор примеров для SQL Server и MS Access .)