我有一个datagrid视图,用于加载数据表中的数据
此数据表中填充了SQL Server数据库中的数据
当用户加载发票时,我会从此数据表填充数据网格视图
然后我允许用户修改发票,这将包括添加/编辑/删除数据表中的行
当用户按下保存按钮时,该数据表将更新到数据库
我需要一种检测行状态的方法,以便正确更新数据库
我可以添加一行没有问题
但是,用户尝试删除从数据库中提取的行,并将其从数据表中删除,但不会将其从数据库中删除
此外,我需要允许用户添加一行,然后删除它,而不存在数据库中存在的行
以下是我目前使用的代码
Dim boolAdded As Boolean = False
Dim boolDeleted As Boolean = False
Dim boolChanged As Boolean = False
Dim cB As SqlCommandBuilder = New SqlCommandBuilder(SQLAdaptor)
Con.ConnectionString = CropTrackMod.strConn
SQLAdaptor.SelectCommand = New SqlClient.SqlCommand("Select * FROM TicketDetailv2 where ticketref ='" & strEditTicketRef & "'", Con)
For Each row As DataRow In myTable.Rows
If row.RowState = DataRowState.Added Then
boolAdded = True
End If
If row.RowState = DataRowState.Deleted Then
boolDeleted = True
End If
If row.RowState = DataRowState.Modified Then
boolChanged = True
End If
Next
If boolAdded = True Then
Dim tmpAddedMyTable As DataTable = myTable.GetChanges(DataRowState.Added)
If tmpAddedMyTable.Rows.Count >= 0 Then
For Each row As DataRow In tmpAddedMyTable.Rows
row.Item("TicketRef") = strEditTicketRef
Next
SQLAdaptor.InsertCommand = cB.GetInsertCommand
SQLAdaptor.Update(tmpAddedMyTable)
End If
End If
If boolChanged = True Then
Dim tmpChangedMyTable As DataTable = myTable.GetChanges(DataRowState.Modified)
SQLAdaptor.InsertCommand = cB.GetUpdateCommand
SQLAdaptor.Update(tmpChangedMyTable)
End If
If boolDeleted = True Then
Dim tmpDeletedMyTable As DataTable = myTable.GetChanges(DataRowState.Deleted)
SQLAdaptor.InsertCommand = cB.GetDeleteCommand
SQLAdaptor.Update(tmpDeletedMyTable)
End If
任何帮助将不胜感激
先谢谢你们
答案 0 :(得分:1)
我现在已经修复了我的方式错误
问题是由于我正在从dataTable中删除这行
myTable.Rows.RemoveAt(dgvTicketDetail.CurrentCell.RowIndex)
但是如果我删除这样的行就可以了
myTable.Rows(dgvTicketDetail.CurrentCell.RowIndex).Delete()
这是有效的,因为它会在更新发生之前将行标记为删除。
我在迭代表中的行时必须改进逻辑,以便不包括已删除的行。这是通过以下方式实现的:
for each row as datarow in myTable.rows
if not row.rowstate = datarowstate.deleted then
end if
next