Miguel M Posted May 30, 2013 at 12:59 AM Report #509691 Posted May 30, 2013 at 12:59 AM 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
legd1991 Posted May 30, 2013 at 07:50 AM Report #509695 Posted May 30, 2013 at 07:50 AM 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
bioshock Posted May 30, 2013 at 08:28 AM Report #509698 Posted May 30, 2013 at 08:28 AM 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.
Miguel M Posted May 30, 2013 at 01:56 PM Author Report #509828 Posted May 30, 2013 at 01:56 PM 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
bioshock Posted May 30, 2013 at 02:14 PM Report #509842 Posted May 30, 2013 at 02:14 PM 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).
Miguel M Posted May 30, 2013 at 02:26 PM Author Report #509855 Posted May 30, 2013 at 02:26 PM 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.
bioshock Posted May 30, 2013 at 02:53 PM Report #509876 Posted May 30, 2013 at 02:53 PM Atenção, eu estou a utilizar vários backgroundWorkers para carregar as DataGridViews, isto faz com que os processos sejam trabalhados em threads diferentes da do Form, possibilitando assim o 'não-crash' da aplicação. http://stuffpinho.wordpress.com/2013/05/22/csharp-working-with-threads/ -> está em C# mas é de fácil tradução para Visual Basic.
Miguel M Posted May 31, 2013 at 12:22 AM Author Report #510109 Posted May 31, 2013 at 12:22 AM 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
bioshock Posted May 31, 2013 at 08:36 AM Report #510126 Posted May 31, 2013 at 08:36 AM 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á.
Miguel M Posted May 31, 2013 at 02:24 PM Author Report #510249 Posted May 31, 2013 at 02:24 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now