Tenho um código que estava em um botão e funciona bem ,porém gostaria de
fazer isto no botão delete,tentei:
Private Sub DataGrid1_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles DataGrid1.KeyPress
Try
If e.KeyChar = Chr(Keys.Delete) Then
Dim Comando As OleDbCommand = MyConnection.CreateCommand()
With Comando
.CommandText = "DELETE FROM Equipamento WHERE cod_equip
= @Codigo"
.Parameters.Add("@Codigo", OleDbType.Integer)
.Parameters("@Codigo").SourceColumn = "cod_equip"
End With
daEquipamentos.DeleteCommand = Comando
daEquipamentos.Update(ds.Tables("Equipamentos"))
End If
Catch ex As OleDbException
Dim oledbError As OleDbError
Dim msg As String
For Each oledbError In ex.Errors
msg += oledbError.Message & Environment.NewLine
Next
MessageBox.Show(msg)
End Try
End Sub
Mas não consegui.
Como proceder?
Obrigado.
--
Marcelo.
Não se esqueça de qualificar essa mensagem como útil.
"Marcelo Larangeira" escreveu:
O problema é que o registro tem que estar apagado no DataTable primeiro para
depois você chamar o DataAdapter. No momento que você chama o Update não tem
nada apagado no DataTable.
Você tem duas opções: 1) Apagar no DataTable e então executar seu código; 2)
Mudar sua rotina para ao invés de apagar via Update do DataAdapter, apagar
direto.
Para o 1) seria isso:
Try
If e.KeyChar = Chr(Keys.Delete) Then
Dim drv As DataRowView =
DirectCast(Me.BindingContext(ds.Tables("Equipamentos")).Current, DataRowView)
drv.Delete()
// seu codigo....
Para o 2) seria algo assim:
Try
If e.KeyChar = Chr(Keys.Delete) Then
Dim Comando As OleDbCommand = MyConnection.CreateCommand()
With Comando
.CommandText = "DELETE FROM Equipamento WHERE cod_equip
= @Codigo"
.Parameters.Add("@Codigo", OleDbType.Integer)
.Parameters("@Codigo").Value = drv("cod_equip")
End With
suaConexao.Open()
comando.ExecuteNonQuery()
suaConexao.Close()
End If
End if
Catch.......
Só que na segunda opção você teria que atualizar o grid chamando o fill de
novo. Não testei o código, mas é por aí a coisa...
--
Abraços,
Francisco.
Ok,Computer - http://thespoke.net/blogs/fbcjunior/default.aspx
Tentei no KeyPress e KeyDown ai vai o KeyPress:
Private Sub DataGrid1_KeyPress(ByVal sender As Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles DataGrid1.KeyPress
Try
If e.KeyChar = Chr(Keys.Delete) Then
Dim drv As DataRowView =
DirectCast(Me.BindingContext(ds.Tables("Equipamentos")).Current, DataRowView)
Dim Comando As OleDbCommand = MyConnection.CreateCommand()
With Comando
.CommandText = "DELETE FROM Equipamento WHERE cod_equip
= @Codigo"
.Parameters.Add("@Codigo", OleDbType.Integer)
.Parameters("@Codigo").SourceColumn = "cod_equip"
End With
daEquipamentos.DeleteCommand = Comando
daEquipamentos.Update(ds.Tables("Equipamentos"))
End If
Catch ex As OleDbException
Dim oledbError As OleDbError
Dim msg As String
For Each oledbError In ex.Errors
msg += oledbError.Message & Environment.NewLine
Next
MessageBox.Show(msg)
End Try
End Sub
Coloquei um breakpoint no if ,porém simplesmente não passa pela linha!
Agora que eu percebi que se trata de um DataGrid. Ele não vai passar pelos
eventos de Keys mesmo, a menos que você derive um controle dele e processe o
wndproc.
Mas eu acho que não precisa disto. Seu objetivo é que quando o usuário fizer
um delete no Datagrid já salve no banco, certo? Então, quando isto acontecer,
quando o usuário der um delete no DataGrid vai disparar o evento RowDeleted
do DataTable que está no DataGrid. Então você pode usar este evento para
executar o código de deleção no banco. No evento Load do seu form, ou assim
que você tiver o DataSet preenchido com o DataTable que você exibe no
DataGrid, você deve assinar o evento RowDeleted do DataTable:
AddHandler seuDataSet.Tables("SuaTabela").RowDeleted, New
DataRowChangeEventHandler( AddressOf Me.RemoverLinha )
Então você declara o método RemoverLinha no seu Form:
Private Shared Sub RemoverLinha(sender As Object, e As DataRowChangeEventArgs)
' Aqui vem o código seu, lá do primeiro post, não o meu código.
End Sub
Deve funcionar, não testei, mas acredito que sim.
Para chegar ao seu nível vai ser difícil,mais uma vez você acertou em
cheio,ficou assim:
Private Sub RemoverLinha(ByVal sender As Object, ByVal e As
DataRowChangeEventArgs)
Try
Dim Comando As OleDbCommand = MyConnection.CreateCommand()
With Comando
.CommandText = "DELETE FROM Equipamento WHERE cod_equip =
@Codigo"
.Parameters.Add("@Codigo", OleDbType.Integer)
.Parameters("@Codigo").SourceColumn = "cod_equip"
End With
daEquipamentos.DeleteCommand = Comando
daEquipamentos.Update(ds.Tables("Equipamentos"))
Catch ex As OleDbException
Dim oledbError As OleDbError
Dim msg As String
For Each oledbError In ex.Errors
msg += oledbError.Message & Environment.NewLine
Next
MessageBox.Show(msg)
End Try
End Sub
Francisco,quer dizer que quando preenchido por um datatable o datagrid se
comporta apenas como um "container"?
Ainda neste segmento ,gostaria de eliminar os botões insert e atualizar,vi
um post seu:
e outro:
se referem a isso?
Obrigado por tudo!
--
Marcelo
Quanto ao DataGrid, pode até ser visto como um contâiner, mas ele é mais do
que isso porque ele interage diretamente com a sua fonte de dados, ele lida
com o conteúdo que está exibindo.
Então, os exemplos lá é que o Pedro queria salvar toda vez que o usuário
alterasse qualquer coluna, e no seu caso não, você quer salvar toda vez que
há uma operação de linha, então os eventos que você usará são diferentes. No
caso, além do RowDeleted que você já está usando, as operações de Insert e
Update devem ficar no evento RowChanged.
Seria basicamente você adicionar este evento e nele colocar um código
semelhante ao RowDeleted, mas desta vez para fazer a inserção e alteração dos
dados. Acredito que deva funcionar, embora nunca tenha feito algo assim. Eu
prefiro fazer o usuário confirmar a operação através de um botão e tal...
Se você coloca botão de confirmação ,nem vou pensar,faço o mesmo!
Nos forms com textbox,coloco os botões Novo,Salvar,Editar e Cancelar,porém
com datagrid só basta um?
Botão Salvar:
Try
Dim Comando As OleDbCommand = MyConnection.CreateCommand()
With Comando
.CommandText = "Insert into Equipamento (cod_equip,
cod_fabr,nome_equip,serie_equip,diaria) Values (?,?,?,?,?)"
.Parameters.Add("@Codigo", OleDbType.Integer)
.Parameters.Add("@Fabr", OleDbType.VarChar, 20)
.Parameters.Add("@Nome", OleDbType.VarChar, 50)
.Parameters.Add("@Serie", OleDbType.VarChar, 50)
.Parameters.Add("@Diaria", OleDbType.Integer)
.Parameters("@Codigo").SourceColumn = "cod_equip"
.Parameters("@Fabr").SourceColumn = "cod_fabr"
.Parameters("@Nome").SourceColumn = "nome_equip"
.Parameters("@Serie").SourceColumn = "serie_equip"
.Parameters("@Diaria").SourceColumn = "diaria"
End With
daEquipamentos.InsertCommand = Comando
daEquipamentos.Update(ds.Tables("Equipamentos"))
Catch ex As OleDbException
Dim oledbError As OleDbError
Dim msg As String
For Each oledbError In ex.Errors
msg += oledbError.Message & Environment.NewLine
Next
MessageBox.Show(msg)
End Try
Na Tecla Delete:
O código do penúltimo post.
É isso mesmo?
Obrigado e descupe tanta amolação.
Abraços!
--
Marcelo.
O que eu costumo fazer é mais ou menos o que eu fiz no exemplo
CadastroVb.zip que tem aqui:
http://thespoke.net/blogs/fbcjunior/archive/2005/11/23/Exemplos.aspx
Mas veja, não há nada de errado no que você propôs a fazer, é um vício meu
mesmo. Eu costumo mandar o usuário confirmar tudo para depois não vir falando
qualquer coisa do sistema.:)
Eu faço o Insert,Update e Delete no botão salvar, tudo de uma vez, então
teria que ter os três commands preparados. Mas como disse, não vejo problemas
no seu approach, é com você.
Abraços.
--
Marcelo