Ir para o conteúdo
Retsu9

DatagridView e Datasource

Mensagens Recomendadas

Retsu9

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):

3MUPsO5.jpg?1

Com DataAdapter:

B2XRMsW.png?1

ZtxfXAt.png?1

 

Espero que me tenha feito entender :P

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

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

  • Voto 1

"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"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Retsu9

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,

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Retsu9

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.
  

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

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

 

  • Voto 1

"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"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Retsu9

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:

8d3xVqI.png

56Wxk0M.png

Fk6L9p8.png

 

Agradeço a paciência!

Cumprimentos,

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

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"

assinatura.jpg

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.