[Resolvido] Como fazer update/ Refresh - Visual Basic .NET - Portugal-a-Programar
[Resolvido] Como fazer update/ Refresh
By prokton, January 16, 2013 in Visual Basic .NET
Criei um projeto simples de registo de "clientes / produtos vendidos" feito em vb.net 2010 e ms-Access.
Utilizo apenas 1 form: Textbox's para os clientes e DataGrid para os produtos vendidos.
As tabelas estão relacionadas um-muitos.
Funciona tudo lindamente,
mas quando faço criar cliente novo, a Chave primária num.Automatica "Cliente" tem o nº (-1)
Isso faz com que não seja possível registar o produto vendido no datagrid, pois aparece uma mensagem de erro a dizer que tenho que criar primeiro o cliente. A solução é sair e entrar na aplicação novamente
A minha pergunta é: Como é que consigo "atualizar" ou "refresh" a aplicação sem ter que sair/entrar?
Me.TableAdapterManager.UpdateAll(Me.dsAplicaçao)
Mas continua sem funcionar bem.
Estás a correr diretamente no programa ou na aplicação ?
"Estás a correr diretamente no programa ou na aplicação ?"
Se é pelo botão "debug" do vb ou se é pelo .exe? Faz diferença? Por acaso já tentei das 2 formas mas o problema é o mesmo
Penso que será isso. É que sou muito verdinho nessas coisas da programação.
Há uns tempos, uns colegas passaram pelo mesmo problema, e por acaso lembrei-me..
Então nem pelo executável funciona ?
O metodo UpdateAll, apenas grava todos os dados de todas as tabelas, que se encontrem em memória. dsAplicação é o dataset da aplicação, suponho. E pelo que percebi queres fazer um refresh de uma tabela e da respectiva datagridview.
Para fazer refresh à datagridview podes usar o metodo refresh() . A questão é que antes de poderes fazer o refresh tens de recarregar os dados da tabela em access para a datatable. Podes limpar as tabelas usando o metodo .clear() , mas vais ter de as preencher a seguir. Como não vi o restante código não sei se estás a usar IDataReader , para carregar os dados, por isso sugiro que re-utilizes o código que usas no inicio da form, para carregar os dados.
Datatable1.clear()
Ao criar um cliente novo; Nome, Morada, etc...( textbox's), depois de clicar em "save" que a numerção automática(Chave primária) fosse também atualizada... mas fica sempre (-1) em vez de IDCliente= 14 por Ex.
e não se consegue introduzir os "produtos" relacionados com esse cliente, porque "produtos" está numa outra tabela em modo "DataGrid". as tabelas estão relacionadas um-muitos no IdCliente
A solução é sair da aplicação, voltar a entrar e aí sim, o IDCliente é 14 e já se consegue associar produtos a ele...
Quero encontrar uma forma de atualizar tudo sem ter que sair da aplicação
Não consigo explicar melhor...
Por acaso viste a resposta que te dei ?
Eu percebi a questão, e expliquei-te uma forma de a resolver. Só não coloquei o código todo prontinho! O problema está no refresh da tabela que não é feito, mas isso tem diversas questões, primeiro não faço ideia de que forma estás a aceder à base de dados, não faço ideia se estás a usar databindings, etc... Depois a solução que apresentei, funciona, basta implementa-la. O que precisas para a implementar está explicado.
Se tiveres dificuldades em implementar diz.
Agradeço ter respondido tão prontamente.
A maneira mais fácil que encontrei foi utilizar o "wizrd" para criar o DataSet, ClientesBindingSource, ServicosTableAdapter, etc..
e o único código que há é o infra citado (Gerado pelo VB)
Peço desculpa, se calhar fui eu que não soube interpretar a sua resposta,
mas ainda me faz um pouco de confusão tudo isto dos Binding, Table Adapter, DataSet, etc...
Mais uma vez obrigado pela sua ajuda...
Private Sub ClientesBindingNavigatorSaveItem_Click(sender As System.Object, e As System.EventArgs) Handles ClientesBindingNavigatorSaveItem.Click
Me.ServicosBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me.TransportesBrancoDataSet)
'TODO: This line of code loads data into the 'TransportesBrancoDataSet.Servicos' table. You can move, or remove it, as needed.
Me.ServicosTableAdapter.Fill(Me.TransportesBrancoDataSet.Servicos)
'TODO: This line of code loads data into the 'TransportesBrancoDataSet.Clientes' table. You can move, or remove it, as needed.
Me.ClientesTableAdapter.Fill(Me.TransportesBrancoDataSet.Clientes)
Edited January 16, 2013 by Caça
Bastou passar o Código do Private Sub Form1_Load para cima (Private Sub ClientesBindingNavigatorSaveItem_Click
Agora existe outro problema para resolver )
Ao clicar "save" ele retorna o 1º Registo(Cliente) e tenho que encontrar uma forma de ir para o último automaticamente...
Como é que se põe [Resolvido] ?
Super Resolvido. Obrigado pela ajuda.
Bastou passar o Código do (Private Sub Form1_Load) para cima (Private Sub ClientesBindingNavigatorSaveItem_Click)