Jump to content
Retsu9

DatagridView e Datasource

Recommended Posts

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

Share this post


Link to post
Share on other 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

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

Share this post


Link to post
Share on other 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,

Share this post


Link to post
Share on other 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.
  

 

Share this post


Link to post
Share on other 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

 

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

Share this post


Link to post
Share on other 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,

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.