Ao vincular o DataSet ao controle Datagrid
e usar o objeto DataAdapter para modificar o banco de dados,
como:
dim adp como novo OleDbDataAdapter(stradp,conn)
dim ocb como novo OleDbCommandBuilder(adp)
adp.DeleteCommand=ocb.GetDeleteCommand()
adp.Update(ds,"Pedidos")
-----------------------------------------
Ao realizar a operação de exclusão, se adicionarmos um método como este:
sub mydatagrid_delete(remetente como objeto, e como datagridcommandeventargs)
dim dt como novo DataTable()
dt = ds.Tables("Pedidos")
dim dr como DataRow
dr = dt.Rows(E.Item.ItemIndex)
dr.delete
'dr.AcceptChanges' Certa vez, tentei usar a exclusão completa e descobri que quando o adp era atualizado automaticamente de volta ao banco de dados, a instrução sql correspondente não poderia ser gerada automaticamente
'para resolver a exceção do índice da página que ocorreu ao excluir o último item do atual página
'********************************************** ***************
dim lastEditPage como inteiro = mydatagrid.currentPageIndex
Se (mydatagrid.pageCount - mydatagrid.currentPageIndex) = 1 e mydatagrid.Items.Count = 1 Então
Se mydatagrid.pageCount > 1 Então
últimaEditPage = ÚltimaEditPage - 1
Outro
últimaEditPage = 0
Terminar se
Terminar se
minhadatagrid.currentPageIndex = lastEditPage
'********************************************** **************
sessão("listapedidos") = ds
minhadatagrid.edititemindex = -1
mydatagrid.datasource = ds.tables("Pedidos")
minhadatagrid.databind()
end sub
Ocorreu uma exceção ao excluir o primeiro um por um. Verificou-se que ao excluir o segundo, ele não pôde ser excluído, ou seja, o dr(2) original não se tornou automaticamente dr(1). Se usarmos dr.delete dr.acceptChanges, as alterações podem ser feitas automaticamente, mas conforme explicado acima, as atualizações automáticas não podem ser usadas para retornar ao banco de dados. Devemos obter o índice real ao excluir, então usamos este método para criar outra tabela no ds atual para manter a exclusão síncrona, mas salvamos o valor real do índice na coluna id da tabela. O código específico é o seguinte:
Uma maneira
.para resolver o índice dr:
dim orderTable as new DataTable() 'Cria uma tabela temporária para salvar o índice e manter a exclusão sincronizada
escurecer theNewRow como DataRow
dim dc como DataColumn
orderTable.TableName = "orderId"
ds.Tables.add(ordemTabela)
dc = novaColunaDeDados()
dc.ColumnName = "id"
ordemTabela.colunas.add(dc)
dim dcKey() as DataColumn = {orderTable.Columns("id")}
orderTable.primaryKey = dcKey
escurecer i como número inteiro
Para i = 0 para (ds.Tables("Users").Rows.Count - 1)
theNewRow = orderTable.NewRow()
theNewRow("id") = i.toString()
orderTable.Rows.add(theNewRow)
Próximo
código adicionado na função de exclusão acima, substitua dr = dt.Rows(e.Item.ItemIndex):
dim drOrder as DataRow
drOrder = ds.Tables("orderId").Rows(E.Item.ItemIndex)
dim currentOrder como inteiro = CInt(drOrder("id")) + mydatagrid.currentPageIndex * mydatagrid.PageSize
dr = dt.Rows(pedidoatual)
drOrder.delete
Se houver uma função de atualização, substitua dr = dt.Rows(e.Item.ItemIndex):
dim drOrder as DataRow
drOrder = ds.Tables("orderId").Rows(E.Item.ItemIndex)
dim currentOrder como inteiro = CInt(drOrder("id")) + mydatagrid.currentPageIndex * mydatagrid.PageSize
dr = dt.Rows(pedidoatual)