Retsu9 Posted March 7, 2018 at 09:46 AM Report #609643 Posted March 7, 2018 at 09:46 AM Boas, Tenho um projecto em execução já há algum tempo, mas tenho tido alguns problemas com os tempos de preenchimento das datagrids, isto porque não estou a fazer o procedimento mais correcto (penso eu). Dese que me lembro que carrego as datagrids com o seguinte código: Public Sub carregar_saidas(ByVal DG As DataGridView) n_rows = 0 DG.Rows.Clear() query = "Select * from tbl_saidas as s, tbl_produtos as p Where s.Produto=p.Produto Order By s.Data DESC" dr = executar_query_Reader(query) While dr.Read n_rows += 1 Dim n As Integer = DG.Rows.Add() DG.Rows.Item(n).Cells(0).Value = dr("ID") DG.Rows.Item(n).Cells(1).Value = dr("s.Produto") DG.Rows.Item(n).Cells(2).Value = dr("s.Quantidade") DG.Rows.Item(n).Cells(3).Value = dr("Unidade") DG.Rows.Item(n).Cells(4).Value = dr("Obra") DG.Rows.Item(n).Cells(5).Value = Format(dr("Data"), "dd/MM/yyyy") DG.Rows.Item(n).Cells(6).Value = Format$(CSng(dr("Valor_uni")), "###,####,##0.00") & " €" DG.Rows.Item(n).Cells(7).Value = Format$(CSng(dr("Total")), "###,####,##0.00") & " €" End While con.Close() End Sub isto funciona bem com poucos registos, de momento já tenho quase 400 e demora uma eternidade a carregar, pois estou a criar linha a linha... Tentei então usar datatables e dataadapters, mas como não estou bem habituado a usar esse método não estou a conseguir visualizar os dados como quero...com o código que uso atualmente tenho total liberdade de adicionar a cada célula o campo da tabela da base de dados que quero, mudar as cores das linhas, formatar as células, acrescentar simbolos etc.. com o código que mostro abaixo não consigo nada disso, para além que ele me ignora as colunas que criei na datagrid e adiciona novas com base na tabela access. query = "Select * from tbl_saidas as s, tbl_produtos as p Where s.Produto=p.Produto Order By s.Data DESC" Dim DataAdapter As New OleDbDataAdapter(query, cs) Dim MyData As New DataSet DataAdapter.Fill(MyData, "tbl_saidas") Me.dg_saidas.DataSource = MyData.Tables("tbl_saidas") o resultado final é bem diferente, o que eu quero, e atualmente faz (MUITO lento): Com DataAdapter: Espero que me tenha feito entender 😛
Retsu9 Posted March 9, 2018 at 12:27 PM Author Report #609690 Posted March 9, 2018 at 12:27 PM Alguém? 😕
apocsantos Posted March 9, 2018 at 09:36 PM Report #609701 Posted March 9, 2018 at 09:36 PM Boa noite, Porque não usas async/await? Public Async Sub carregar_saidas(ByVal DG As DataGridView) await Task.Run(Sub() fillDataGrid(DG) EndSub) End Sub E o preenchimento da tabela: Public Sub fillDataGrid(ByVal DG As DataGridView) n_rows = 0 DG.Rows.Clear() query = "Select * from tbl_saidas as s, tbl_produtos as p Where s.Produto=p.Produto Order By s.Data DESC" dr = executar_query_Reader(query) While dr.Read n_rows += 1 Dim n As Integer = DG.Rows.Add() DG.Rows.Item(n).Cells(0).Value = dr("ID") DG.Rows.Item(n).Cells(1).Value = dr("s.Produto") DG.Rows.Item(n).Cells(2).Value = dr("s.Quantidade") DG.Rows.Item(n).Cells(3).Value = dr("Unidade") DG.Rows.Item(n).Cells(4).Value = dr("Obra") DG.Rows.Item(n).Cells(5).Value = Format(dr("Data"), "dd/MM/yyyy") DG.Rows.Item(n).Cells(6).Value = Format$(CSng(dr("Valor_uni")), "###,####,##0.00") & " €" DG.Rows.Item(n).Cells(7).Value = Format$(CSng(dr("Total")), "###,####,##0.00") & " €" End While con.Close() End Sub Cordiais cumprimentos, Apocsantos 1 Report "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
Retsu9 Posted March 12, 2018 at 10:32 AM Author Report #609730 Posted March 12, 2018 at 10:32 AM obrigado pela resposta, de facto desconhecia o async/wait, contudo quando introduzi esse código no projecto ele dá-me erros de formatação, como se esperasse um End Sub, copiei tal e qual a tua resposta, não sei como corrigir, pois nunca usei nada do género. Outra dúvida é onde deva colocar esse código, visto que eu tenho um módulo onde tenho o código para diversas datagrids, carregar_saidas, carregar_produtos, etc... e chamo esses métodos no form respetivo. Ora esse AsyncSub, coloco no módulo onde tenho o procedimento carregar_saidas, ou no form onde faço o call? Um muito obrigado pela ajuda Cumprimentos,
Retsu9 Posted March 12, 2018 at 02:37 PM Author Report #609747 Posted March 12, 2018 at 02:37 PM Esta-me a dar este erro : Citação System.InvalidOperationException ocorrido HResult=0x80131509 Message=A operação entre threads não é válida: controlo 'dg_saidas' acedido a partir de um thread diferente do thread onde foi criado.
apocsantos Posted March 12, 2018 at 03:28 PM Report #609748 Posted March 12, 2018 at 03:28 PM Boa tarde, O meu vb.net está "enferrujado", por isso foi parecido com o que faço para C#. Se criares um Module para fazer estas tarefas, na sub principal colocas o código abaixo: Sub main() Dim task = New Task(AddressOf fillDataGridSubAsync) task.Start() task.Wait() End Sub Public Async Sub fillDataGridSubAsync(ByVal DG As DataGridView) Dim task As Task(Of Integer) = FillDGVAsync(DG) End Sub Async Function fillDataGridSubAsync(ByVal DG As DataGridView) As Task(Of Integer) n_rows = 0 DG.Rows.Clear() query = "Select * from tbl_saidas as s, tbl_produtos as p Where s.Produto=p.Produto Order By s.Data DESC" dr = executar_query_Reader(query) While dr.Read n_rows += 1 Dim n As Integer = DG.Rows.Add() DG.Rows.Item(n).Cells(0).Value = dr("ID") DG.Rows.Item(n).Cells(1).Value = dr("s.Produto") DG.Rows.Item(n).Cells(2).Value = dr("s.Quantidade") DG.Rows.Item(n).Cells(3).Value = dr("Unidade") DG.Rows.Item(n).Cells(4).Value = dr("Obra") DG.Rows.Item(n).Cells(5).Value = Format(dr("Data"), "dd/MM/yyyy") DG.Rows.Item(n).Cells(6).Value = Format$(CSng(dr("Valor_uni")), "###,####,##0.00") & " €" DG.Rows.Item(n).Cells(7).Value = Format$(CSng(dr("Total")), "###,####,##0.00") & " €" End While con.Close() End Function O erro que te estava a dar é por causa do async estar a usar uma thread diferente da thread onde estão o resto dos metodos. Cordiais cumprimentos, Apocsantos 1 Report "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
Retsu9 Posted March 12, 2018 at 03:48 PM Author Report #609750 Posted March 12, 2018 at 03:48 PM Agora estou mais confuso ainda x.X Não estou a perceber bem esse código, coloquei tudo no form onde está a datagrid, não sei se é suposto ficar assim, mas dá-me estes erros: Agradeço a paciência! Cumprimentos,
apocsantos Posted March 13, 2018 at 03:08 PM Report #609762 Posted March 13, 2018 at 03:08 PM Boa tarde, Mais simples que estar a tentar fazer um exemplo do zero, é indicar-te um bom exemplo na net. https://code.msdn.microsoft.com/Populate-DataGridView-via-a3ede35a Cordiais cumprimentos, Apocsantos "A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now