Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Deletando através da tecla Delete

0 views
Skip to first unread message

Marcelo Larangeira

unread,
Jan 21, 2006, 5:13:02 PM1/21/06
to
Olá!

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.

Rodrigo Speller

unread,
Jan 22, 2006, 12:09:02 AM1/22/06
to
Faça pelo evento KeyUp ou KeyDown
e peça o parâmetro "e.KeyCode = Keys.Delete"

Não se esqueça de qualificar essa mensagem como útil.


"Marcelo Larangeira" escreveu:

Francisco Benedito de Cerqueira Junior

unread,
Jan 22, 2006, 3:40:02 AM1/22/06
to
Marcelo,

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

Marcelo Larangeira

unread,
Jan 22, 2006, 6:59:02 AM1/22/06
to
Francisco e Rodrigo

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!

Francisco Benedito de Cerqueira Junior

unread,
Jan 22, 2006, 7:50:02 AM1/22/06
to
Marcelo,

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.

Marcelo Larangeira

unread,
Jan 22, 2006, 9:42:02 AM1/22/06
to
Francisco

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:

http://www.microsoft.com/brasil/msdn/newsgroups/default.mspx?&query=automaticamente&lang=pt&cr=BR&guid=&sloc=pt-BR&dg=microsoft.public.br.dotnet.languages.vb&p=1&tid=56cc852f-beb3-4f03-b47a-f5114ed4dcbe

e outro:

http://www.microsoft.com/brasil/msdn/newsgroups/default.mspx?&query=automaticamente&lang=pt&cr=BR&guid=&sloc=pt-BR&dg=microsoft.public.br.dotnet.languages.vb&p=1&tid=e6aa1968-9380-4751-ab0b-cbcd515cf206

se referem a isso?

Obrigado por tudo!
--
Marcelo

Francisco Benedito de Cerqueira Junior

unread,
Jan 23, 2006, 6:01:03 AM1/23/06
to
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...

Marcelo Larangeira

unread,
Jan 23, 2006, 5:38:44 PM1/23/06
to
Francisco,

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.

Francisco Benedito de Cerqueira Junior

unread,
Jan 23, 2006, 10:47:02 PM1/23/06
to
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ê.

Marcelo Larangeira

unread,
Jan 24, 2006, 1:59:02 AM1/24/06
to
Obrigado Francisco.

Abraços.
--
Marcelo

0 new messages