Jump to content
Miguel M

DataGridView perde imagens na ordenação

Recommended Posts

Miguel M

Boas,

Estou aqui com um "pequeno" problema, tenho uma DataGridView ligada ao DataSource e posteriormente adiciono imagens numa coluna Unbound, até aqui tudo a rodar, mas ao clicar na ordenação (o AllowUserToOrderColumns está True, tem que estar) as imagens já eram... desaparecem. Alguma solução???

Adiciono as imagens com algum critério mas basicamente, para simples compreensão é isto:

For Each row As DataGridViewRow In DataGridView1.Rows
  row.Cells("Imagem").Value = ImageList1.Images.Item(0)
Next

Já agora (fica 2 em 1) alguém dá tem uma dica para adicionar as imagens em runtime? Ou Seja ao mesmo tempo que os dados do DataSource são carregados?

Agradecido,

Miguel M

Edited by Rui Carlos
Formatação do código.

Share this post


Link to post
Share on other sites
legd1991

Boas,

Bem vindo ao fórum.

Antes de mais, devias fazer a tua apresentação no fórum, e ler as regras: http://www.portugal-a-programar.pt/guidelines/

Relativamente ao teu problema vê se isto ajuda:

Public Sub CreateGraphicsColumn()

Dim treeIcon As New Icon(Me.GetType(), "tree.ico")
Dim iconColumn As New DataGridViewImageColumn()

With iconColumn
 .Image = treeIcon.ToBitmap()
 .Name = "Tree"
 .HeaderText = "Nice tree"
End With

dataGridView1.Columns.Insert(2, iconColumn)

End Sub

Share this post


Link to post
Share on other sites
bioshock

Já agora (fica 2 em 1) alguém dá tem uma dica para adicionar as imagens em runtime? Ou Seja ao mesmo tempo que os dados do DataSource são carregados?

O evento RowPrePaint() é uma opção.

Share this post


Link to post
Share on other sites
Miguel M

Boas,

legd1991

Peço desculpa, sou novo e não li as regras como devia ter feito... de qualquer forma a apresentação está feita e as regras lidas.

A tua sugestão não funciona, independentemente de adicionar uma nova coluna ou preencher células de coluna existente ao ordenar as imagens desvinculam-se e desaparecem!

bioshock

Sim foi por os eventos da datagridview que fiz as primeiras tentativas, até me pareceu mais logico fazer no RowAdded que deveria acontecer a cada nova linha adicionada à datagridview, estou a testar com 50 registos (rows) mas o evento só acontece 2 vezes!! nas duas primeiras linhas.

O que sugeres RowPrePaint funciona mas acontece em todas célula da linha, com 50 linhas X 10 células são já 500 vezes que o evento acontece e demora uma eternidade, com o aumento dos dados a coisa complica-se... talvez com código arranjar forma de fazer neste evento mas 1 vez por linha, na verdade é o que procuro mas sem ter que recorrer a código.

Obrigado

Share this post


Link to post
Share on other sites
bioshock

O que te posso dizer é que, estou neste momento a utilizar o evento RowPrePaint() para 1797 registos e em três distintas DataGridViews.

Estou com ~2000 linhas de código só no Form1, que maioritariamente chama classes que se estabelecem uma connection à base de dados e fazem múltiplas queries, tudo isto é carregado em ~746 ms. Se fizer Refresh() já dentro do form, o valor desce para os ~300 ms.

Não sei se a tua informação é mais sensível do que a minha, mas eu não tenho problemas. De salientar que eu uso DataSources (que aumentam a performance em grande escala).

Share this post


Link to post
Share on other sites
Miguel M

Curioso! testei a tua sugestão com um código que me parece simples, coloquei somente no RowPrePaint():

DataGridView1.Rows(e.RowIndex).Cells("Imagem").Value = ImageList1.Images.Item(0)

Também estou a usar DataSources e com os 50 registo que disse a aplicação não bloqueia mas fica a "mastigar" ao ponto de ter que parar o debugging, testei colocando uma msg no RowPrePaint e realmente a ação acontece em cada célula o que me leva a crer que deve existir algum evento que aconteça somente em cada nova linha adicionada mas não encontro.

Share this post


Link to post
Share on other sites
Miguel M

Independentemente dos backgroundWorkers poderem ajudar ainda acho que não é melhor pratica, mas pesquisando também não encontrei nada obvio, juntar na mesma datagridview colunas bound e unbound parece dar alguns 31's no entanto resolvi por código:

If e.RowIndex < 0 Then Exit Sub

If DataGridView.Columns(e.ColumnIndex).Name = "Imagem" Then
  e.FormattingApplied = True

  If CInt(DataGridView1.Rows(e.RowIndex).Cells(0).Value) > 30 Then
	e.Value = ImageList1.Images.Item(0)
  Else
	e.Value = ImageList1.Images.Item(1)
  End If

End If

Adicionando imagens com este método também não desvinculam e desaparecem como estava a acontecer anteriormente, para já esta resolvido o "remediado".

Obrigado pela ajuda

Share this post


Link to post
Share on other sites
bioshock

Achas que os backgrounds não são a melhor prática? Em que é que te baseias para dizeres isso? Quando tiveres 1000 linhas e a aplicação crashar-se por todo lado para executar tudo na mesma thread, volta cá.

Share this post


Link to post
Share on other sites
Miguel M

Não me expliquei corretamente, ou não entendes-te, acho que talvez não seja a melhor pratica a adição de imagens nas datagridview da forma que estou a fazer e que falamos, penso que deve existir algo mais "logico" ou talvez não...

Não me referia aos backgroundWorkers ou à divisão de tarefas por diferentes threads que tem o seu beneficio óbvio.

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.