Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Julierme Felix

[Resolvido] Form+TabControl+Datagrid VS2003

Recommended Posts

Pessoal tenho um form com tabcontrol esse possui dois tabpage, na tabpage1 tenho um datagrid, na tabpage 2 tenho os textboxes, ao clicar duas vezes no item selecionado na tabpage1 abre a tabpage2 com os controles preenchidos, até aí beleza, mas se eu voltar ao tabpage1 e clicar em uma outra linha acontece um erro.

 

código do double click do datagrid

 

CODE
Private Sub DataGrid1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.DoubleClick

Try

TabControl1.SelectedTab = TabPage1

Me.EditID.Visible = True

Me.Label1.Visible = True

EditID.DataBindings.Add("Text", dt, "id")

EditCodigo.DataBindings.Add("Text", dt, "codigo")

EditIgreja.DataBindings.Add("Text", dt, "igreja")

EditPr.DataBindings.Add("Text", dt, "pastor")

EditEndereco.DataBindings.Add("Text", dt, "endereço")

EditBairro.DataBindings.Add("Text", dt, "bairro")

EditCidade.DataBindings.Add("Text", dt, "cidade")

EditEstado.DataBindings.Add("Text", dt, "estado")

EditCEP.DataBindings.Add("Text", dt, "cep")

Catch ex As Exception

' em caso de erro, exibo na tela

MessageBox.Show(ex.ToString(), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

End Sub

 

Segue o erro:

 

System.ArgumentException: This would cause two bindings in the collection to bind to the same property.

 

Parameter name: binding

 

Tenho nesse mesmo form uma toolbar, onde possuo os botões (incluir, alterar, gravar, cancelar, excluir e fechar)

 

Quando clico em alterar abre a tabpage2 com os dados do item selecionado no datagrid da tabpage1 faço as alterações necessárias, mas ao clicar no botão gravar ele gravar um outro registro com as alterações, ficando duplicado (um certo e um errado). como acertar isso?

 

código do botão gravar

 

CODE
cn.Open()

Dim DA1 = New OleDbDataAdapter("select * from igrejas", cn)

Dim cb As New OleDbCommandBuilder

cb = New OleDbCommandBuilder(DA1)

Dim ds1 = New DataSet

DA1.Fill(IgrejasDS2, "igrejas")

Me.EditID.Visible = True

Me.Label1.Visible = True

Me.EditID.Text = ProximoNumero()

Dim drAux As DataRow

drAux = IgrejasDS2.Tables("igrejas").NewRow

drAux("ID") = EditID.Text

drAux("Codigo") = EditCodigo.Text

drAux("Igreja") = EditIgreja.Text

drAux("Pastor") = EditPr.Text

drAux("Endereço") = EditEndereco.Text

drAux("Bairro") = EditBairro.Text

drAux("Cidade") = EditCidade.Text

drAux("Estado") = EditEstado.Text

drAux("CEP") = EditCEP.Text

IgrejasDS2.Tables("igrejas").Rows.Add(drAux)

OleDbDataAdapter1.Update(IgrejasDS2)

DA1.Update(IgrejasDS2, "igrejas")

IgrejasDS2.AcceptChanges()

 

Com os dados sendo visualizados na tabpage2 (controles) e ao clicar no botão excluir ele exclui sempre o registro acima do registro. por exemplo escolhi o registro ID=9 no datagrid, clico duas vezes abre a tabpage2 onde posso alterar, excluir, cancelar e gravar, se escolher excluir ele exclui o ID=8 e não o ID=9. como resolver isso também.

 

 

 

codigo do botão excluir

CODE
Dim Result As DialogResult

result = MessageBox.Show("Deseja excluir a Igreja: " + EditIgreja.Text, "Exclusão de Igreja", MessageBoxButtons.YesNo)

If result = DialogResult.Yes Then

IgrejasDS2.Tables("igrejas").Rows(Me.BindingContext(IgrejasDS2.Tables("igrejas")).Position).Delete()

OleDbDataAdapter1.Update(IgrejasDS2)

MessageBox.Show("Igreja Excluida", "Exclusão de Igreja")

TabControl1.SelectedTab = TabPage2

carregardados()

Else

EditCodigo.Focus.ToString()

End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme aplicações Windows não é muito minha área, mas vou tentar ajudar.

No primeiro problema o erro acontece em qual linha exatamente, pq você adiciona DataBindings a vários TextBox deve ser alguma particularidade em algum dado.

No segundo problema, fiquei com dúvida, primeiro você deu um Rows.Add na sua DataSet, depois deu dois Update em DataAdapters diferentes, existe a necessidade de todos esses Updates.

No terceiro problema quando você carrega o EditIgreja.Text ele traz o nome correto que deve ser excluido?

 

Ta indo mais na atenção de ajudar, não é muito minha área. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme aplicações Windows não é muito minha área, mas vou tentar ajudar.

No primeiro problema o erro acontece em qual linha exatamente, pq você adiciona DataBindings a vários TextBox deve ser alguma particularidade em algum dado.

No segundo problema, fiquei com dúvida, primeiro você deu um Rows.Add na sua DataSet, depois deu dois Update em DataAdapters diferentes, existe a necessidade de todos esses Updates.

No terceiro problema quando você carrega o EditIgreja.Text ele traz o nome correto que deve ser excluido?

 

Ta indo mais na atenção de ajudar, não é muito minha área. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Abraços...

Olá

A primeira opção eu já consegui resolver usando o código abaixo.

CODE
'Limpa o databindings

EditID.DataBindings.Clear()

EditCodigo.DataBindings.Clear()

EditIgreja.DataBindings.Clear()

EditPr.DataBindings.Clear()

EditEndereco.DataBindings.Clear()

EditBairro.DataBindings.Clear()

EditCidade.DataBindings.Clear()

EditEstado.DataBindings.Clear()

EditCEP.DataBindings.Clear()

Não existe a necessidade desses dois updates, é que fui fazendo testes e esqueci de desabilitar um deles.

Executo um Rows.Add para adicionar uma nova linha com os dados digitados nos controles, deve ser por isso que quando abro um registro já salvo e faço alterações o registro é gravado novamente com as alterações, duplicando assim o registro.

Como posso fazer, para que se for um novo registro ele adicione a linha na tabela e se for somente uma alteração do registro já gravado ele salve somente as alterações não duplicando o registro.

 

o controle editigreja.text ali é só para mostrar na messagebox qual a igreja que esta esta sendo excluida.

A exclusão é pelo form de alteração é não pelo datagrid.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme aplicações Windows não é muito minha área, mas vou tentar ajudar.

No primeiro problema o erro acontece em qual linha exatamente, pq você adiciona DataBindings a vários TextBox deve ser alguma particularidade em algum dado.

No segundo problema, fiquei com dúvida, primeiro você deu um Rows.Add na sua DataSet, depois deu dois Update em DataAdapters diferentes, existe a necessidade de todos esses Updates.

No terceiro problema quando você carrega o EditIgreja.Text ele traz o nome correto que deve ser excluido?

 

Ta indo mais na atenção de ajudar, não é muito minha área. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Abraços...

Olá

A primeira opção eu já consegui resolver usando o código abaixo.

CODE
'Limpa o databindings

EditID.DataBindings.Clear()

EditCodigo.DataBindings.Clear()

EditIgreja.DataBindings.Clear()

EditPr.DataBindings.Clear()

EditEndereco.DataBindings.Clear()

EditBairro.DataBindings.Clear()

EditCidade.DataBindings.Clear()

EditEstado.DataBindings.Clear()

EditCEP.DataBindings.Clear()

Não existe a necessidade desses dois updates, é que fui fazendo testes e esqueci de desabilitar um deles.

Executo um Rows.Add para adicionar uma nova linha com os dados digitados nos controles, deve ser por isso que quando abro um registro já salvo e faço alterações o registro é gravado novamente com as alterações, duplicando assim o registro.

Como posso fazer, para que se for um novo registro ele adicione a linha na tabela e se for somente uma alteração do registro já gravado ele salve somente as alterações não duplicando o registro.

 

o controle editigreja.text ali é só para mostrar na messagebox qual a igreja que esta esta sendo excluida.

A exclusão é pelo form de alteração é não pelo datagrid.

 

 

Pessoal consegui resolver a questão da exclusão.

 

Esta faltando agora só a opção de alterar e incluir.

 

 

Segue o código do botão de excluir

 

CODE
Dim Result As DialogResult

result = MessageBox.Show("Deseja excluir a Igreja: " + EditIgreja.Text, "Exclusão de Igreja", MessageBoxButtons.YesNo)

If result = DialogResult.Yes Then

cn.Open()

Dim Cm As New OleDb.OleDbCommand("Delete * from igrejas Where ID=" + EditID.Text, cn)

Cm.ExecuteNonQuery()

Cm.Dispose()

MessageBox.Show("Igreja Excluida", "Exclusão de Igreja")

cn.Close()

Incluir.Enabled = True

Alterar.Enabled = True

Gravar.Enabled = False

Cancelar.Enabled = False

Excluir.Enabled = False

Fechar.Enabled = True

TabControl1.SelectedTab = TabPage2

carregardados()

Else

EditCodigo.Focus.ToString()

End If

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme no último botão excluir que você postou você executou o comando direto no banco de dados. E no anterior você estava tentando excluir através de um DataSet. Se for como o botão excluir você pode executar o comando de Update direto no banco.

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme no último botão excluir que você postou você executou o comando direto no banco de dados. E no anterior você estava tentando excluir através de um DataSet. Se for como o botão excluir você pode executar o comando de Update direto no banco.

 

Abraços...

Como poderia estar fazendo isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme no último botão excluir que você postou você executou o comando direto no banco de dados. E no anterior você estava tentando excluir através de um DataSet. Se for como o botão excluir você pode executar o comando de Update direto no banco.

 

Abraços...

Como poderia estar fazendo isso?

 

Consegui resolver a questão da atualização

 

usando o código abaixo

CODE
cn.Open()

Dim dat2 As OleDbDataAdapter

Dim ds2 As DataSet

Dim myLin As OleDbCommand = cn.CreateCommand()

Dim myCB As String = "select * from igrejas where Codigo=@col"

myLin.CommandText = myCB

myLin.Parameters.Add("@col", SqlDbType.NVarChar).Value = EditCodigo.Text.Trim

dat2 = New OleDbDataAdapter(myLin)

ds2 = New DataSet

dat2.SelectCommand = myLin

Dim dr1 As OleDbDataReader

dat2.Fill(ds2, "igrejas")

dat2.Update(ds2, "igrejas")

cn.Close()

MessageBox.Show("Igreja Atualizada", "Alteração", MessageBoxButtons.OK, MessageBoxIcon.Information)

TabControl1.SelectedTab = TabPage2

Agradeço a todos pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme no último botão excluir que você postou você executou o comando direto no banco de dados. E no anterior você estava tentando excluir através de um DataSet. Se for como o botão excluir você pode executar o comando de Update direto no banco.

 

Abraços...

Como poderia estar fazendo isso?

 

Consegui resolver a questão da atualização

 

usando o código abaixo

CODE
cn.Open()

Dim dat2 As OleDbDataAdapter

Dim ds2 As DataSet

Dim myLin As OleDbCommand = cn.CreateCommand()

Dim myCB As String = "select * from igrejas where Codigo=@col"

myLin.CommandText = myCB

myLin.Parameters.Add("@col", SqlDbType.NVarChar).Value = EditCodigo.Text.Trim

dat2 = New OleDbDataAdapter(myLin)

ds2 = New DataSet

dat2.SelectCommand = myLin

Dim dr1 As OleDbDataReader

dat2.Fill(ds2, "igrejas")

dat2.Update(ds2, "igrejas")

cn.Close()

MessageBox.Show("Igreja Atualizada", "Alteração", MessageBoxButtons.OK, MessageBoxIcon.Information)

TabControl1.SelectedTab = TabPage2

Agradeço a todos pela ajuda

 

Pessoal achei que tivesse resolvido a questão da atualização, mas olha só que esta acontecendo, o código acima atualiza os dados vejo isso no datagrid, mas ao fechar o form e abrir novamente não houve nenhuma alteração, ou seja as alterações não foram gravadas no banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme utilize o comando ExecuteNonQuery da mesma forma que fez com o delete, basta trocar sua query de delete para update.

cn.Open()
Dim Cm As New OleDb.OleDbCommand("SEU_COMANDO_UPDATE", cn)
Cm.ExecuteNonQuery()
Cm.Dispose()
MessageBox.Show("Igreja Alterada", "Alteração de Igreja")
cn.Close()

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Julierme utilize o comando ExecuteNonQuery da mesma forma que fez com o delete, basta trocar sua query de delete para update.

cn.Open()
Dim Cm As New OleDb.OleDbCommand("SEU_COMANDO_UPDATE", cn)
Cm.ExecuteNonQuery()
Cm.Dispose()
MessageBox.Show("Igreja Alterada", "Alteração de Igreja")
cn.Close()

Abraços...

OLá

Não sei se estou fazendo certo, ocorre um erro de sintaxe.

 

CODE
Try

cn.Open()

Dim Cm1 As New OleDb.OleDbCommand("UPDATE * from obreiros Where ID=" + EditID.Text, cn)

Cm1.ExecuteNonQuery()

Cm1.Dispose()

Catch ex As Exception

' em caso de erro, exibo na tela

MessageBox.Show(ex.ToString(), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)

End Try

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual é o erro exatamente e em qual linha?

 

Abraços...

O erro acontece na linha do UPDATE, diz que é erro de sintaxe na instrução SQL.

Eu coloquei assim: Dim Cm1 As New OleDb.OleDbCommand("UPDATE * from obreiros Where ID=" + EditID.Text, cn)

 

Esta pesquisando vi alguns exemplos de update assim:

Dim Cm1 As New OleDb.OleDbCommand("UPDATE obreiros set nome=@nome, endereco=@endereco Where ID=" + EditID.Text, cn)

 

Não poderei usar o * para todos os campos como por exemplo na instrução do delete?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade não tinha reparado na sua instrução de update. Você não pode usar o asterisco, por que como você definirá os valores do seu campo? Não terá como. O Correto é desta forma usando o @ que fica como parâmetro e uma forma mais simples:

 

Dim Cm1 As New OleDb.OleDbCommand("UPDATE obreiros set nome='" + txtNome.Text + "', endereco='"+ txtEndereco.Text + "' Where ID=" + EditID.Text, cn)

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verdade não tinha reparado na sua instrução de update. Você não pode usar o asterisco, por que como você definirá os valores do seu campo? Não terá como. O Correto é desta forma usando o @ que fica como parâmetro e uma forma mais simples:

 

Dim Cm1 As New OleDb.OleDbCommand("UPDATE obreiros set nome='" + txtNome.Text + "', endereco='"+ txtEndereco.Text + "' Where ID=" + EditID.Text, cn)

Abraços...

OLá

Segue o código

CODE
cn.Open()

Dim myLin As OleDbCommand = cn.CreateCommand()

Dim myCB As String = "UPDATE obreiros set codigreja=?,nome=?,endereco=?,bairro=?,cidade=?,UF=?,CEP=?,email=?,telefone=?,estadocivil=?,datnascimento=?,rg=?,orgexp=?,cpf=?,profissao=?,empregado=?,patente=?,arma=?,aposentadoria=?,tempodeserviço=?,localizacao=? where ID=" + EditID.Text

myLin.CommandText = myCB

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = cboIgreja.SelectedValue

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditNome.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditEndereco.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditBairro.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditCidade.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = cboEstado.SelectedItem

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditCep.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditEmail.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditTelefone.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = cbocivil.SelectedItem

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditDtNasc.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditRG.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditOrgao.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditCPF.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditProfissao.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = cboempregado.SelectedItem

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditPatente.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditArma.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = cboAposentado.SelectedItem

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditEmpresa.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = EditTempo.Text

myLin.Parameters.Add("?", SqlDbType.NVarChar).Value = Editlocalizacao.Text

 

mylin.ExecuteNonQuery()

mylin.Dispose()

cn.Close()

Só que alguns campos irão se necessário ficar em branco, aí acontece um erro dizendo que o campo não pode ser nulo.

Por exemplo o campo de patente, de arma, de aposentadoria, se ficar sem dados acontece o erro.

Como evitar isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esta configuração é feito no seu banco de dados, o campo deve ser NOT NULL ou seja não aceita valor nulo, você tem que alterar esta propriedade de cada coluna.

 

Abraços...

Valeu muito obrigado, tinha esquecido disso!!!

 

Agora esta OK!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.