Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

dadomingues

Imagem em DataGrid

Recommended Posts

Olá,Meu problema é esse: Tenho imagens em um diretório e gostaria de exibi-las, como ícones, no datagrid. Não quero gravá-las na base de dados, quero gravar somente a indicação (1 para a imagem 1.jpg) na base. É mais ou menos assim:Cidade - segunda - terça - quartaSão Paulo - Chuva - Sol - NubladoRio - Sol - Sol - NubladoAo invés de exibir o texto, exibir as imagens do diretório, isso tudo em um DataGrid.É possível. Não sei como fazer referência a uma imagem em um DataGrid...Obrigado!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, já tentei fazer algo assim e o resultado não ficou 100%, mas acho que já é um ponto de partida. Criei duas classes, uma é uma subclasse de DataGrid (com o evento OnPaint sobrescrito) e a outra é utilizada para representar um objeto (célula do datagrid) da datasource (que é uma ArrayList). Abaixo segue o código de ambas (como você não especificou qual linguagem está utilizando, e também para aproveitar o recurso de late-bound, fiz em VB.NET):

 

	Class DataGridImagem		Inherits DataGrid 		Protected Overrides Sub OnPaint(ByVal pe As System.Windows.Forms.PaintEventArgs)			If Not pe Is Nothing Then				MyBase.OnPaint(pe)				If Not Me.DataSource Is Nothing Then					Dim i As Integer 					For i = 0 To Me.DataSource.count - 1						Dim imagem As Image = Me.DataSource(i).Imagem						Dim posição As Rectangle = Me.GetCellBounds(i, 0) 						pe.Graphics.DrawImage(imagem, posição)					Next				End If			End If		End Sub	End Class 	Class Imagem		Private __caminho As String		Private __imagem As Image 		Public Sub New(ByVal caminho As String)			__caminho = caminho			__imagem = Image.FromFile(caminho)		End Sub 		Public Property Caminho() As String			Get				Return __caminho			End Get			Set(ByVal Value As String)				__caminho = Value			End Set		End Property 		Public Property Imagem() As Image			Get				Return __imagem			End Get			Set(ByVal Value As Image)				__imagem = Value			End Set		End Property	End Class

E, agora um exemplo de utilização:

 

Dim dados As New ArrayList()		dados.AddRange(New Imagem() {New Imagem("c:\pasta\imagem1.jpg"), New Imagem("c:\pasta\imagem2.jpg"), New Imagem("c:\pasta\imagem3.jpg")}) 		Dim d As New DataGridImagem()		Me.Controls.Add(d)		d.SetBounds(10, 10, 250, 250)		d.DataSource = dados		d.Visible = True

Espero que o exemplo lhe seja útil.

 

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Graymalkin, funcionou! Só que agora eu estava precisando, e tentando, fazer uma função para retornar a linha e coluna da célula clicada. Criei essas funções dentro da classe DataGridImagem Public Function PegaX() As String PegaX = Me.CurrentCell.RowNumber.ToString End Function Public Function PegaY() As String PegaY = Me.CurrentCell.ColumnNumber.ToString End FunctionNão sei como fazer para quando clicar no data grid, executar essas funções e jogar numa label.Dentro da classe do form coloquei o seguinte código que peguei e adaptei de outro site, mas deve estar faltando alguma declaração ou está tudo errado! Já tentei e mudei diversas coisas... vai lá: Private Sub d_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles d.Click Label2.Text = sender.PegaX() & " - " & sender.PegaY() End SubEu nunca fiz nada em .Net e estou perdido em alguns pontos. Se alguém puder me ajudar...Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você pode utilizar o evento CurrentCellChanged para isso, do mesmo jeito que você utilizou o evento Click.

 

Private Sub d_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles d.CurrentCellChanged		Label2.Text = sender.PegaX() & " - " & sender.PegaY()	End Sub

Veja se dá certo.

 

Abraços,

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

dadomingues:Declarei d como DataGridImagem fora da sub Form_Load para que todas tenham acesso. Ao utilizar a rotina desta maneira, apareceu:ErrorHandles clause requires a WithEvents variable defined in the containing type or one of its base types.O que eu posso fazer? Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Declare com eventos (WithEvents), como o erro está informando:

 

Dim WithEvents d As DataGridImagem

Certo? ;)

 

Graymalkin

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.