Ir para conteúdo

Arquivado

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

Agnaldo Silva

Imagem em DataGridView e Progress Bar

Recommended Posts

Estou tentando criar um softwares, nada muito sofisticado, é mais operação básica de leitura, escrita, atualização e exclusão num banco de dados que se eu perceber que ficou legal, pretendo distribuir como opensource. Estou fazendo para estudo e aprimoramento nessa linguagem que estou começando agora. Estou enfrentando alguns problemas por enquanto:

 

Tenho um DataGridView que recebe dados a partir de um banco de dados. Até aí tudo bem. Criei a conexão com o banco e quando o Form carrega, o DataGrid é preenchido com os dados da consulta SQL. Porém tenho três colunas que recebem valor 1 ou 2 e gostaria que esses valores fossem substituídos por imagens (1 por um circulo vermelho e 2 por um círculo verde). Porém não estou conseguindo isso de jeito nenhum. Pesquisei bastante e achei algumas idéias, mas nada que fosse funcional pra mim. Acho que não deve ser muito complicado (pra quem já manja http://forum.imasters.com.br/public/style_emoticons/default/grin.gif ) Segue o código pra quem queira dar uma olhada:

 

Public Sub preencherDataGrid()
	   Dim cn As New SqlConnection(conexao) 'string de conexão em uma classe separada
	   Dim ConsultaSql As New SqlCommand 
	
	   Try
			If cn.State = ConnectionState.Closed Then
				cn.Open() 'se a conexão estiver fechada, então abra
			End If

			
			ConsultaSql.CommandText = "SELECT campo1, campo2, campo3, campo4, campo5, campo6, campo7, campo8, campo9  FROM tabela" 'consulta SQL pra pegar os dados do banco de dados
			ConsultaSql.CommandType = CommandType.Text
			ConsultaSql.Connection = cn
			ConsultaSqll.ExecuteNonQuery()

			dtAdapter.SelectCommand = cSql

			dtAdapter.Fill(dtDataSet)

			DataGridView.AutoGenerateColumns = True 'gera automaticamente as colunas

			DataGridView.DataSource = dtDataSet.Tables(0) 'preenche o DaraGrid

			'nomeia as colunas
			DataGridView.Columns.Item(0).HeaderText = "campo1"
			DataGridView.Columns.Item(1).HeaderText = "campo2"
			DataGridView.Columns.Item(2).HeaderText = "campo3"
			DataGridView.Columns.Item(3).HeaderText = "campo4"
			DataGridView.Columns.Item(4).HeaderText = "campo5"
			DataGridView.Columns.Item(5).HeaderText = "campo6"
			DataGridView.Columns.Item(6).HeaderText = "campo7"	 'campo que eu quero colocar a imagem (por enquanto estou trabalhando nesse)
			DataGridView.Columns.Item(7).HeaderText = "campo8"	 'campo que eu quero colocar a imagem
			DataGridView s.Columns.Item(8).HeaderText = "campo9"	'campo que eu quero colocar a imagem

						For Each linha As DataGridViewRow In DataGridView.Rows
				Select Case DataGridView.CurrentRow.Cells.Item(6).Value
					Case "1"
						'se o valor da 6a célula for 1 mostra imagem vermelha
						DataGridView.CurrentRow.Cells.Item(6).Value = ImageList.Images.Item(1)
					Case "2"
						'se o valor da 6a célula for 2 mostra imagem verde
						DataGridView.CurrentRow.Cells.Item(6).Value = ImageList.Images.Item(2)
				End Select
			Next
		Catch ex As Exception
			MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Stop)
		End Try

	End Sub

Outra coisa que eu gostaria de colocar no software também, é uma ProgressBar, pra quando o usuário clicar no menu para abrir uma janela com por exemplo, os seus Contatos, aparecesse uma Form com uma ProgressBar e algumas informações da quantidade de registros que já foram carregados (tipo: "Foram carregados X registro de Y") e só depois de carregar tudo, aparecer a janela com os dados. Se puderem me dar uma força, agradeço! http://forum.imasters.com.br/public/style_emoticons/default/joia.gif

 

[]'s

 

EDIT:

 

Esqueci de postar: estou usando a seguinte função para tentar mudar o conteúdo da célula, mas o máximo que eu consigo é mudar pra outro número, o que não me resolve nada :( Vou colocar esse código no bloco de cima também pra não confundir vocês ok? Nessa parte dá um erro de incompatibilidade do tipo de dado.

For Each linha As DataGridViewRow In DataGridView.Rows
				Select Case DataGridView.CurrentRow.Cells.Item(6).Value
					Case "1"
						'se o valor da 6a célula for 1 mostra imagem vermelha
						DataGridView.CurrentRow.Cells.Item(6).Value = ImageList.Images.Item(1)
					Case "2"
						'se o valor da 6a célula for 2 mostra imagem verde
						DataGridView.CurrentRow.Cells.Item(6).Value = ImageList.Images.Item(2)
				End Select
			Next

EDIT 2:

 

No banco de dados, mudei o tipo do campo6 de INT para VARCHAR e não está mais dando o erro, porém o que aparece agora não é a imagem e sim "System.Drawing.Bitmap" e isso acontece só na primeira linha. Há algum erro no meu Loop?

Vou tentar mais algumas alterações pra ver se dá certo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agnaldo, Seja Bem Vindo ao Fórum iMasters, de uma olhada em nossas regras: Regras do Fórum iMasters

 

Veja se esses artigos lhe auxiliam:

http://www.macoratti.net/08/04/vbn_dgi.htm

http://www.macoratti.net/vbn_pb1.htm

 

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por responder, Bruno.

 

Li o artigo que você me passou (aliás já tinha até visto eles antes) e tentei fazer novamente qualquer coisa baseado nele, porém sem sucesso. Me parece que esse DataGrid (do VB.NET 2003) que o autor usa no artigo é diferente do DataGridView que eu estou usando no VB.NET 2008. Não estou conseguindo seguir a lógica dele por hora :/

 

Estava pensando no seguinte: quando o Form for carregar, e o DataGridView for preenchido, deixo essa coluna invisível e crio uma nova coluna de imagens usando a condição:

 

Se ValorDaCélula6 = 1 Então
	 ValorDaCélulaNova = "ImagemVermelha"
Senão Se ValorDaCélula6 = 2 Então
	 ValorDaCélulaNova = "ImagemVerde"
Fim Se

Estou no caminho certo? Existe alguma forma melhor de fazer o que eu quero?

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.