GRID TRAVANDO COM STORED PROCEDURE.
tem uns 100 mil registros ou mais, quando abre o form ele já dispara a SP..
só que ele da uma travada de uns 5~6 segundos, como eu faço pra ir carregando o grid sem travar? em alguns sistemas eu ja vi que ele vai
adicionando linhas a mais no grid conforme vai rodando a query.. teria como eu fazer isso?
Ou colocar tipo um loading, enquanto carrega pq o pessoal acha que o sistema trava..
utilizo VB.Net mais pode ser em C# também não tem problema.
Grato!
A grid tem um número máximo de registros que aceita.
[][ô]s,
Tunusat.
tenho mais de 80 mil registros, ele carrega, só que ele trava por uns segundos minha aplicação mesmo usando Stored procedure.
Tô tentando achar, mas sei que no VB6 tem esta restrição por causa deste artigo do Macoratti:
VB6 - Preenchendo o MSFLexGrid mais rápido
http://www.macoratti.net/vb6_msfg.htm
Citação:Nota: Limites de exibição de células nos controles de grid
O controle FlexGrid é limitado a exibir 350.000 células total. Essa limitação difere da limitação que está documentada na arquivo da Ajuda FlexGrid.
A Ajuda diz o seguinte: [Ô] O número mÃnimo de linhas e colunas é 0. O número máximo é limitado pela memória disponÃvel no seu computador. [Ô]
Embora essa declaração é verdadeira para o controle Hierarchical FlexGrid (MSHFLXGD.OCX), ele é incorreto para o controle FlexGrid (MSFLXGRD.OCX).
Essa limitação de 350.000 células ocorre em qualquer computador, sem considerar a memória que está disponÃvel. Assim, se você tiver duas colunas, a quantidade máxima de linhas que você pode ter é 175.000. Da mesma forma, se você tiver cinco colunas, a quantidade máxima de linhas que você pode ter é 70.000.
No caso do controle Hierarchical FlexGrid ele sempre exibe um máximo de 2048 linhas sem considerar o número de registros no fonte de dados.
Mas não acho nada referente as grids no VB.Net...
[][ô]s,
Tunusat.
Citação::
Mestre,
Tô tentando achar, mas sei que no VB6 tem esta restrição por causa deste artigo do Macoratti:
VB6 - Preenchendo o MSFLexGrid mais rápido
http://www.macoratti.net/vb6_msfg.htm
Nota: Limites de exibição de células nos controles de grid
O controle FlexGrid é limitado a exibir 350.000 células total. Essa limitação difere da limitação que está documentada na arquivo da Ajuda FlexGrid.
A Ajuda diz o seguinte: [Ô] O número mÃnimo de linhas e colunas é 0. O número máximo é limitado pela memória disponÃvel no seu computador. [Ô]
Embora essa declaração é verdadeira para o controle Hierarchical FlexGrid (MSHFLXGD.OCX), ele é incorreto para o controle FlexGrid (MSFLXGRD.OCX).
Essa limitação de 350.000 células ocorre em qualquer computador, sem considerar a memória que está disponÃvel. Assim, se você tiver duas colunas, a quantidade máxima de linhas que você pode ter é 175.000. Da mesma forma, se você tiver cinco colunas, a quantidade máxima de linhas que você pode ter é 70.000.
No caso do controle Hierarchical FlexGrid ele sempre exibe um máximo de 2048 linhas sem considerar o número de registros no fonte de dados.
Mas não acho nada referente as grids no VB.Net...
[][ô]s,
Tunusat.
Entendi TUNUSAT na verdade preciso de uma Thread pro form não congelar, porque eu chamo um form que tem um ProgressPanel da DevExpress.. porém nunca fiz nenhuma Thread..
Tenho 2 forms, um formLoading e o outro frmPrincipalPCP, quando eu carrego o grid com 4 mil registros quero que ele não congele e fique com um Show no formLoading, até ai fiz o frmLoading.Show e depois no final dos For eu do um frmLoading.Show.. só que ele congela tudo.. eu preciso que ele não congele
usando Application.DoEvents() funcionou mais não ficou legal, ele não congela mais porém o meu progresspanel do outro form fica parado ele não fica girando
Eu coloquei um exemplo de THREAD aqui que NÃO congela, por favor veja:
===================================================
MULTITHREADING VB.NET
http://www.vbmania.com.br/index.php?modulo=detalhe&id=9326
===================================================
Talvez tenha algo no código que te ajude.
[][ô]s,
Tunusat.
Talvez você possa trabalhar com faixas de trabalho.
A query precisa ter algo que limite o numero de registros na cláusula WHERE.
Pode ser uma data, uma faixa de registros, ou qualquer outra coisa que limite o número de registros que serão emitidos.
No caso da thread, cada thread pode trabalhar ao mesmo tempo com uma faixa diferente de pesquisa query, mas não vai fazer milagre de jogar tudo dentro da mesma grid.
Outra solução seria ao invés de jogar na grid, jogar dentro de um arquivo excel... pode ser?
[][ô]s,
Tunusat.
Olha meu código
Aqui tenho o código para carregar os dados no Grid com minha Stored Procedure (coloquei mes: 00 e ano: 0000 como parametro pq ta como cadastro de teste apenas):
Private Sub CarregaGridRecebimento()
Try
objConexao.Open()
Dim strProc As String = [Ô]SelectPCP[Ô]
Dim cmd As MySqlCommand = New MySqlCommand(strProc, objConexao)
Dim da As MySqlDataAdapter = New MySqlDataAdapter(cmd)
Dim dt As DataTable = New DataTable
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue([Ô]ParamMesAtual[Ô], [Ô]00[Ô])
cmd.Parameters.AddWithValue([Ô]ParamAnoAtual[Ô], [Ô]0000[Ô])
da.Fill(dt)
grdRecebimentoPcp.DataSource = dt
grdRecebimentoPcp.ClearSelection()
With Me.grdRecebimentoPcp
.DefaultCellStyle.BackColor = Color.White
.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue
.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End With
Me.grdRecebimentoPcp.EnableHeadersVisualStyles = True
[txt-color=#e80000] Dim Thread As New System.Threading.Thread(AddressOf RodaEvent)
Thread.Start() [/txt-color]
Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
objConexao.Close()
End Try
End Sub
Agora minha Sub RodaEvent:
Private Sub RodaEvent()
Dim x As Integer = 0
For x = 0 To grdRecebimentoPcp.Rows.Count - 1
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]ROD[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.DarkGray
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.White
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]PNU[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.White
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]ELT[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.LawnGreen
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]BIC[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Gold
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]FIO[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Yellow
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]BRI[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.SkyBlue
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]EPI[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Red
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]ESP[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Tomato
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]QUI[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.LightBlue
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
If Me.grdRecebimentoPcp.Rows(x).Cells(3).Value.ToString.Contains([Ô]MIC[Ô]) Then
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.BackColor = Color.Purple
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(x).Cells(3).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If
Next
For I As Integer = 0 To grdRecebimentoPcp.RowCount - 1
For coluna As Integer = 0 To 31
If Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Value.ToString = [Ô]SIM[Ô] Then
Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Style.BackColor = Color.LimeGreen
End If
If Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Value.ToString = [Ô]NÃO[Ô] Then
Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Style.BackColor = Color.Tomato
End If
If Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Value.ToString = [Ô]APROVADO[Ô] Then
Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Style.BackColor = Color.LimeGreen
End If
If Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Value.ToString = [Ô]REPROVADO[Ô] Then
Me.grdRecebimentoPcp.Rows(I).Cells(coluna).Style.BackColor = Color.Tomato
End If
Me.grdRecebimentoPcp.Rows(I).Cells(4).Style.ForeColor = Color.OrangeRed
Me.grdRecebimentoPcp.Rows(I).Cells(8).Style.ForeColor = Color.OrangeRed
Next
Next
End Sub
Funcionou, meu form não congela PORéM ele fica bugado até o fim da execução da thread..
Achei algo, mas diz que deve aceitar muitos registros...
==============================================================================
What is the maximum record count for a DataGrid in VB.NET?
http://stackoverflow.com/questions/673966/what-is-the-maximum-record-count-for-a-datagrid-in-vb-net
There is no explicit limitation in a DataGrid.
However it is constrained by both it[ô]s internal data structures which tend to count rows in terms of Integer. This means the hard limit is Integer.MaxValue
Citação:On a 32 bit system though, you will hit problems long before you hit Integer.MaxValue rows. Every item added to the DataGrid has a certain amount of overhead. If each item only has 4 bytes of overhead, you will max out at Integer.MaxValue / 4. This is really a simplistic view of the problem though because it doesn[ô]t take into account other controls, internal WinForms resources, etc ...
How many records are you thinking of adding?
Citação:The Count property of the DataGridView.Rows collection is an Integer, so the normal range for 4-byte signed integers should apply as an effective limit: 0 to 2,147,483,647
==============================================================================
[][ô]s,
Tunusat.