GRID COM MUITOS REGISTROS

MESTRE 08/07/2015 08:49:39
#448571
Opa galera tudo bom? estou com um problema, tenho uma tabela com 100 mil registros, e estou com algumas dificuldades, primeiro que ao carregar da um erro..



Segundo que tenho uma rotina pra colorir as celulas do grid só que se nem carregar imagina essa rotina passando em 100 mil registros:

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


Dim y As Integer = 0
For y = 0 To grdRecebimentoPcp.Rows.Count - 1
If Me.grdRecebimentoPcp.Rows(y).Cells(15).Value.ToString.Contains([Ô]SIM[Ô]) Then
Me.grdRecebimentoPcp.Rows(y).Cells(15).Style.BackColor = Color.MediumSeaGreen
Me.grdRecebimentoPcp.Rows(y).Cells(15).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(y).Cells(15).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

If Me.grdRecebimentoPcp.Rows(y).Cells(15).Value.ToString.Contains([Ô]NÃO[Ô]) Then
Me.grdRecebimentoPcp.Rows(y).Cells(15).Style.BackColor = Color.OrangeRed
Me.grdRecebimentoPcp.Rows(y).Cells(15).Style.ForeColor = Color.Black
Me.grdRecebimentoPcp.Rows(y).Cells(15).Style.Font = New Font(grdRecebimentoPcp.Font, FontStyle.Bold)
End If

Next


Meu select está assim:

Como faço pra carregar os 100 mil registros e executar os For[ô]s pra colorir o grid e as celulas?
      Try

objConexao.Open()

strSql = [Ô]select * FROM cad_form101 ORDER BY codigo[Ô]

Dim cmd As MySqlCommand = New MySqlCommand(strSql, objConexao)
Dim da As MySqlDataAdapter = New MySqlDataAdapter(cmd)
Dim dt As DataTable = New DataTable

da.Fill(dt)

grdRecebimentopcp.DataSource = dt

[ô] ConfigGrid()

Catch ex As Exception
MessageBox.Show(ex.ToString)
Finally
objConexao.Close()
End Try


Queria que meu grid ficasse tipo loading carregando e fosse adicionando as linhas conforme vai carregando e não travasse.
F001E 08/07/2015 09:07:47
#448573
Você precisa mesmo carregar os 100 mil registros ? E se sim para colorir um FOR não é uma boa ideia.
Use o evento do Grid...

private void dataGridView1_RowDefaultCellStyleChanged(object sender, DataGridViewRowEventArgs e)
{

}
TUNUSAT 08/07/2015 09:31:27
#448574
Resposta escolhida
MESTRE,

Estava fuçando em uma [Ô]MSFlexGrid[Ô] e no site do Macoratti, dentro do sub-título:
==================================================
Nota: Limites de exibição de células nos controles de grid
http://www.macoratti.net/vb6_msfg.htm
==================================================

Aprendi que o número MÁXIMO de registros equivale a 350 mil DIVIDIDO pelo número de colunas, então coloquei o seguinte [Ô]IF[Ô] para que apareça uma mensagem amigável para o usuário:

If msgResumo.Rows >= (350000 / msgResumo.Cols) Then
MsgBox [Ô]O número de registros superou [Ô] & FormatNumber(350000 / msgResumo.Cols, 0) & [Ô].[Ô] & vbCrLf & [Ô]Não é possível colocar mais registros na grade.[Ô], vbOKOnly + vbCritical
[ô]Exit Do
End If


[][ô]s,
Tunusat.
MESTRE 08/07/2015 09:32:16
#448575
Ja tinha tentado utilizar o RowDefaultStyleChanged antes porém foi sem sucesso, tinha tentado assim

      Private Sub grdRecebimentoPcp_RowDefaultCellStyleChanged(sender As Object, e As DataGridViewRowEventArgs) Handles grdRecebimentoPcp.RowDefaultCellStyleChanged

For Each dgvr As DataGridViewRow In grdRecebimentoPcp.Rows
If dgvr.Cells(3).Value.ToString.Contains([Ô]ROD[Ô]) Then
dgvr.DefaultCellStyle.ForeColor = Color.Red
End If
Next

End Sub

Como eu disparo? porque ele carrega o meu grid mas nao dispara a rotina, e o For Each não seria a mesma velocidade que utilizar o For?

Sobre carregar 100 mil registros, preciso sim, pois em uma auditoria preciso mostrar os registros do inicio ao fim, porém para os funcionários irá aparecer somente os registros do mês, más seria interessante uma pesquisa por [Ô]todos[Ô] também..
MESTRE 08/07/2015 09:36:15
#448576
Citação:

:
MESTRE,

Estava fuçando em uma [Ô]MSFlexGrid[Ô] e no site do Macoratti, dentro do sub-título:
==================================================
Nota: Limites de exibição de células nos controles de grid
http://www.macoratti.net/vb6_msfg.htm
==================================================

Aprendi que o número MÁXIMO de registros equivale a 350 mil DIVIDIDO pelo número de colunas, então coloquei o seguinte [Ô]IF[Ô] para que apareça uma mensagem amigável para o usuário:

If msgResumo.Rows >= (350000 / msgResumo.Cols) Then
MsgBox [Ô]O número de registros superou [Ô] & FormatNumber(350000 / msgResumo.Cols, 0) & [Ô].[Ô] & vbCrLf & [Ô]Não é possível colocar mais registros na grade.[Ô], vbOKOnly + vbCritical
Exit Do
End If


[][ô]s,
Tunusat.



Tunusat na verdade to com o VB.NET e utilizando o Grid nativo, entendi o que quis dizer porém eu preciso carregar os 100 mil registros cara, numa auditoria vai que o auditor queira ver a sequencia de registros.. queria colocar como se fosse um loading enquanto vai carregando os registros e também solucionar o problema dos [Ô]For[ô]s[Ô] para trocar as cores do grid.
TUNUSAT 08/07/2015 09:49:43
#448577
MESTRE,

Uma solução seria, ao invés de gerar uma grid, gerar um arquivo texto [Ô].CVS[Ô] ou um arquivo do novo excel [Ô].XLSX[Ô] (NÃO dá para fazer no antigo Excel [Ô].XLS[Ô] pois ele só suporta +/- 64 mil e poucos). Talvez um [Ô].PDF[Ô] (Adobe Portable Document File).
Acho muito difícil uma única pessoa ler um grid absurdo de grande destes ... E se colocar como obrigatório alguns filtros antes de montar a grid? Exemplo: Data Inicial e data final. Isto restringiria o número de linhas...

[][ô]s,
Tunusat.
MESTRE 08/07/2015 09:56:09
#448580
Entendi, bom então vou desistir de carregar 100 mil registros no grid.. kkkkkkkkkk

vou carregar então só os do mes e ja era.. só que to no problema do For ainda..

como fazer pra colorir o grid de uma maneira mais rápida??
TUNUSAT 08/07/2015 10:17:44
#448582
MESTRE,

Bom ... concordo com o [Ô]F001E[Ô].

Veja se sua grid tem esta propriedade [ô]DataGridView.AlternatingRowsDefaultCellStyle[ô]:


========================================================
[Ô]... Se o que pretendes é colorir linha sim, linha não, podes fazê-lo automaticamente através da propriedade [ô]AlternatingRowsDefaultCellStyle[ô] ...[Ô]
http://www.portugal-a-programar.pt/topic/47281-vbnet-colorir-datagridview/
========================================================
Propriedade DataGridView.AlternatingRowsDefaultCellStyle
https://msdn.microsoft.com/pt-br/library/system.windows.forms.datagridview.alternatingrowsdefaultcellstyle(v=vs.110).aspx
[ô] Defina a cor de fundo para todas as linhas e para linhas alternadas.
[ô] O valor para linhas alternadas substitui o valor para todas as linhas.
dataGridView1.RowsDefaultCellStyle.BackColor = Color.LightGray
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.DarkGray

========================================================
How to apply alternating row pattern to only one datagridview column
http://stackoverflow.com/questions/19743429/how-to-apply-alternating-row-pattern-to-only-one-datagridview-column
========================================================
AlternatingRowsDefaultCellStyle Property (GcMultiRow)
http://helpcentral.componentone.com/NetHelp/MultiRow/GrapeCity.Win.MultiRow~GrapeCity.Win.MultiRow.GcMultiRow~AlternatingRowsDefaultCellStyle.html
========================================================
Colorir DATAGRIDVIEW VB.NET
https://social.msdn.microsoft.com/Forums/pt-BR/292b4e08-d130-41e5-a0ef-4f7c11a22050/colorir-datagridview-vbnet
========================================================

[][ô]s,
Tunusat.
OCELOT 08/07/2015 10:21:32
#448583
Se é para auditoria o ideal acho que seria gerar um relatório, não faz sentido exibir tantos registros em um grid, e mesmo em uma auditoria duvido que alguém vá conferir 100 mil registros um por um.

Quando não tem outra forma e se precisa exibir muitos registros em um grid a forma correta é usando o VirtualMode dele, onde você diz para ele quantas linhas existem e em vez de carregar todos os dados de uma vez você trata o evento CellValueNeeded para passar o valor para o grid da linha que ele está pedindo, porém é muito mais complexo de implementar pois você precisa ir carregando os dados aos poucos e ir fazendo um cache deles manualmente, seria algo parecido com fazer uma paginação dos dados.

Eu não possuo nenhum exemplo disso, até porque isso também deve incluir fazer a paginação por SQL no banco de dados e isso muda de um banco para outro, se não me engano o MySQL usa o comando LIMIT para isso.
MESTRE 08/07/2015 10:36:00
#448584
Citação:

:
Se é para auditoria o ideal acho que seria gerar um relatório, não faz sentido exibir tantos registros em um grid, e mesmo em uma auditoria duvido que alguém vá conferir 100 mil registros um por um.

Quando não tem outra forma e se precisa exibir muitos registros em um grid a forma correta é usando o VirtualMode dele, onde você diz para ele quantas linhas existem e em vez de carregar todos os dados de uma vez você trata o evento CellValueNeeded para passar o valor para o grid da linha que ele está pedindo, porém é muito mais complexo de implementar pois você precisa ir carregando os dados aos poucos e ir fazendo um cache deles manualmente, seria algo parecido com fazer uma paginação dos dados.

Eu não possuo nenhum exemplo disso, até porque isso também deve incluir fazer a paginação por SQL no banco de dados e isso muda de um banco para outro, se não me engano o MySQL usa o comando LIMIT para isso.



Entendi muita complexidade, melhor eu carregar mesmo os do Mês apenas e pro auditor eu vou elaborar um relatório pra auditoria de 1000 páginas bem gostosinho direto via Sql Query pros auditores auditor é chato demais começa a querer achar [Ô]pelo em ovo[Ô]...

Citação:

:
MESTRE,

Bom ... concordo com o [Ô]F001E[Ô].

Veja se sua grid tem esta propriedade [ô]DataGridView.AlternatingRowsDefaultCellStyle[ô]:


========================================================
[Ô]... Se o que pretendes é colorir linha sim, linha não, podes fazê-lo automaticamente através da propriedade [ô]AlternatingRowsDefaultCellStyle[ô] ...[Ô]
http://www.portugal-a-programar.pt/topic/47281-vbnet-colorir-datagridview/
========================================================
Propriedade DataGridView.AlternatingRowsDefaultCellStyle
https://msdn.microsoft.com/pt-br/library/system.windows.forms.datagridview.alternatingrowsdefaultcellstyle(v=vs.110).aspx

[ô] Defina a cor de fundo para todas as linhas e para linhas alternadas.
[ô] O valor para linhas alternadas substitui o valor para todas as linhas.
dataGridView1.RowsDefaultCellStyle.BackColor = Color.LightGray
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.DarkGray

========================================================
How to apply alternating row pattern to only one datagridview column
http://stackoverflow.com/questions/19743429/how-to-apply-alternating-row-pattern-to-only-one-datagridview-column
========================================================
AlternatingRowsDefaultCellStyle Property (GcMultiRow)
http://helpcentral.componentone.com/NetHelp/MultiRow/GrapeCity.Win.MultiRow~GrapeCity.Win.MultiRow.GcMultiRow~AlternatingRowsDefaultCellStyle.html
========================================================
Colorir DATAGRIDVIEW VB.NET
https://social.msdn.microsoft.com/Forums/pt-BR/292b4e08-d130-41e5-a0ef-4f7c11a22050/colorir-datagridview-vbnet
========================================================

[][ô]s,
Tunusat.


Então TUNUSAT eu consegui utilizando os For acima, porém ele demora um pouquinho, um desses exemplos tem for também, porém não pode ser o Alternating pois teria que mudar a cor de celulas especificas em todas as linhas e não alternando linha sim,linha não.. mas fica meu agradecimento pois eu desconhecia o alternating..

Porém meu problema é que não consigo disparar o evento DefaultStyleChanged abaixo, no caso utilizando For Each seria mais rapido do que os For[ô]s que eu utilizei la no topo? quero ter o melhor desempenho possível:

    Private Sub grdRecebimentoPcp_RowDefaultCellStyleChanged(sender As Object, e As DataGridViewRowEventArgs) Handles grdRecebimentoPcp.RowDefaultCellStyleChanged

For Each dgvr As DataGridViewRow In grdRecebimentoPcp.Rows
If dgvr.Cells(3).Value.ToString.Contains([Ô]ROD[Ô]) Then
dgvr.DefaultCellStyle.ForeColor = Color.Red
End If
Next

End Sub

NICKOSOFT 08/07/2015 13:12:25
#448589
Carregar sem morrer use o backgroundwork, super simples impementar
Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas