none
Picture box RRS feed

  • Pergunta

  • Galera, preciso do seguinte!

     

    Penso que ja falei nisto aqui mas desde então nao consegi desencravar mais este assunto!

     

    Indo directo ao assunto.

     

    Numa bd tenho o Campo 1 com um link, esse link mostra uma imagem no meu broswer.

    O que preciso é de carregar esse link para um picturebox e mostra la a imagem que me mostra no broswer.

     

    como fazo isso?

    quinta-feira, 16 de dezembro de 2010 13:02

Respostas

  • Flashed,

    Eu fiz um teste simples aqui, coloque em um form um grid, e um botão e coloque este código:

      Private Sub LoadImages(ByVal table As DataTable, ByVal imageColumn As String, ByVal urlColumn As String)
    
        ' cria e configura o webclient...
        Dim client As System.Net.WebClient = New System.Net.WebClient()
        client.Proxy = System.Net.HttpWebRequest.GetSystemWebProxy()
        client.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials
    
        ' adiciona a coluna da imagem na tabela...
        table.Columns.Add(imageColumn, GetType(Byte()))
    
        ' varre as linhas da tabela para preencher a imagem...
        For Each row As DataRow In table.Rows
          ' pega a url...
          Dim url As String = Convert.ToString(row(urlColumn))
          ' faz o download...
          Dim imageData() As Byte = client.DownloadData(url)
          ' seta o valor da tabela...
          row(imageColumn) = imageData
    
        Next
    
      End Sub
    
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
        ' cria a tabela
        Dim table As DataTable = New DataTable("Tabela")
        table.Columns.Add("URL", GetType(String))
    
        ' preenche os dados...
        table.Rows.Add("http://i.microsoft.com/global/en/publishingimages/sitebrand/microsoft.gif")
        table.Rows.Add("http://www.seeklogo.com/images/T/TOTVS-logo-E1C4543ADA-seeklogo.com.gif")
    
        ' carrega as imagens...
        LoadImages(table, "imagem", "URL")
    
        ' seta o grid...
        DataGridView1.DataSource = table
    
      End Sub
    

    Você vai ver que funciona corretamente, o seu problema deve estar relacionado a url da imagem não ser válida ou você está fazendo alguma coisa diferente do que te passei.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    • Marcado como Resposta Jonas São Paulo segunda-feira, 20 de dezembro de 2010 09:17
    sexta-feira, 17 de dezembro de 2010 19:47

Todas as Respostas

  • Flashed,

    Você pode setar a propriedade ImageLocation do seu PictureBox que a imagem será carregada diretamente da Web.

    Mais:

    http://msdn.microsoft.com/en-us/library/system.windows.forms.picturebox.imagelocation.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 16 de dezembro de 2010 13:22
  • não quero carregar directamente da web. Pois juntamente com a imagem são mostradas informações em textbox.

    Quero carregar a imagem da bd através do Link que esta registado na bd

    quinta-feira, 16 de dezembro de 2010 14:05
  • Flashed,

    Explique melhor o que você quer fazer... pelo que eu entendi você tem um registro no seu banco que é um url de uma imagem, correto? Ou você tem um campo blob que armazena a imagem no seu banco?

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    quinta-feira, 16 de dezembro de 2010 16:56
  • Flashed,

    Explique melhor o que você quer fazer... pelo que eu entendi você tem um registro no seu banco que é um url de uma imagem, correto? Ou você tem um campo blob que armazena a imagem no seu banco?

    at.,

    pelo que eu entendi você tem um registro no seu banco que é um url de uma imagem, correto?

    Sim!exactamente isso Rogério!
    sexta-feira, 17 de dezembro de 2010 09:22
  • Flashed,

    Se você estiver usando DataBindings, você pode bindar esta propriedade "ImageLocation" na sua coluna que contem a url, veja este artigo:

    http://blogs.msdn.com/b/marcelolr/archive/2007/06/15/data-binding-a-winforms-picturebox-to-a-file-path-or-url.aspx

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 12:02
  • não tem em tuga?

     

    Ingles não é o meu forte.

    Eu fiz a ligação do datagrid á base de dados sem codigo.

    Consigo fazer a ligação do url?

    sexta-feira, 17 de dezembro de 2010 12:14
  • Flashed,

    Basicamente o que você deve fazer é adicionar um DataBinding ao PictureBox associando a sua tabela e coluna com a URL.

    Seria tipo:

    pictureBox.DataBindings.Add("ImageLocation", table, "FilePath");
    

    Onde o primeiro parâmetro é a propriedade a ser bindada "ImageLocation", o segundo parâmetro é a tabela que contem os dados e a terceira propriedade é o nome do campo que tem a URL na sua tabela.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 12:29
  •  

    No ImageLocation não estou a perceber o que tenho que por

    pictureBox.DataBindings.Add("ImageLocation"
    , Tabela1, "Campo1"
    );
    sexta-feira, 17 de dezembro de 2010 12:37
  • É fixo, o string "ImageLocation" mesmo, porque se refere a propriedade ImageLocation do PictureBox.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 12:45
  • Boas o meu codigo é o seguinte:

    Public Class Form4

        Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    TODO:   'This line of code loads data into the 'ColaboradoresDataSet.Colaboradores' table. You can move, or remove it, as needed.
            Me.ColaboradoresTableAdapter.Fill(Me.ColaboradoresDataSet.Colaboradores)
            PictureBox1.DataBindings.Add("ImageLocation", "Colaboradores", "Campo5")
        End Sub
    End Class

    E aparece-me o seguinte erro:

     

    Cannot bind to the property or column Campo5 on the DataSource.
    Parameter name: dataMember

    sexta-feira, 17 de dezembro de 2010 12:48
  • No caso, você deve passar a instancia da tabela mesmo e não o nome, seria tipo assim:

    Me.ColaboradoresTableAdapter.Fill(Me.ColaboradoresDataSet.Colaboradores)
    PictureBox1.DataBindings.Add("ImageLocation", Me.ColaboradoresDataSet.Colaboradores, "Campo5")
    

    Outro detalhe é como você tem um DataSet tipado, você pode fazer esse código somente uma vez no seu form loading por exemplo.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 12:53
  • Outro detalhe é como você tem um DataSet tipado, você pode fazer esse código somente uma vez no seu form loading por exemplo.

     

    Não percebi Rogério!

    Tem como criar um ciclo que detecte quantas linhas tem a coluna 5 e crie tantos picturebox quantas linhas houver?

    Porque senão cada vez que adicione uma linha na base de dados tenho que criar um picturebox

    sexta-feira, 17 de dezembro de 2010 14:07
  • boas

     

    Não da para por a foto no datagrid?

    Assim só tinha que carregar o datagrid e aparecia la tudo...

    sexta-feira, 17 de dezembro de 2010 14:48
  • Flashed,

    Dar até que da... só que você tem que fazer manualmente, no seu caso o jeito mais simples seria criar uma coluna na tabela em tempo de execução e fazer o download das imagens, seria alguma coisa assim:

      private void LoadImages(DataTable table, string imageColumn, string urlColumn)
      {
       // cria e configura o webclient...
       System.Net.WebClient client = new System.Net.WebClient();
       client.Proxy = System.Net.HttpWebRequest.GetSystemWebProxy();
       client.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
    
       // adiciona a coluna da imagem na tabela...
       table.Columns.Add(imageColumn, typeof(byte[]));
    
       // varre as linhas da tabela para preencher a imagem...
       foreach (DataRow row in table.Rows)
       {
        // pega a url...
        string url = Convert.ToString(row[urlColumn]);
        // faz o download...
        byte[] imageData = client.DownloadData(url);
        // seta o valor da tabela...
        row[imageColumn] = imageData;
       }
      }
    
    

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 16:32
  • Mas o url muda de linha para linha!!

    Este proceso tem um url fixo ne?

     

    sexta-feira, 17 de dezembro de 2010 16:40
  • Não, você passa para a função a DataTable (primeiro parâmetro), o segundo é o nome da coluna que será criada para mostrar a imagem e o terceiro é o nome da coluna que tem a URL.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 17:00
  • Boas

     

    voltando ao inicio..crio o datagrid, crio a ligação á bd através do visual basic e depois onde meto esse codigo?

    O meu codigo é o seguinte:

    Public Class Form4

        Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: This line of code loads data into the 'ColaboradoresDataSet.Colaboradores' table. You can move, or remove it, as needed.
            Me.ColaboradoresTableAdapter.Fill(Me.ColaboradoresDataSet.Colaboradores)

        End Sub
    End Class

    sexta-feira, 17 de dezembro de 2010 17:05
  • Depois do Fill você colocar a chamada, assim a sua tabela já vai estar preenchida.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 17:09
  • Da-me uma data de erros.... :S

     

     

    Public Class Form4

        Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: This line of code loads data into the 'ColaboradoresDataSet.Colaboradores' table. You can move, or remove it, as needed.
            Me.ColaboradoresTableAdapter.Fill(Me.ColaboradoresDataSet.Colaboradores)
    Private void LoadImages(DataTable table, string imageColumn, string urlColumn)
      {
       // cria e configura o webclient...
       System.Net.WebClient client = new System.Net.WebClient();
       client.Proxy = System.Net.HttpWebRequest.GetSystemWebProxy();
       client.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;

       // adiciona a coluna da imagem na tabela...
       table.Columns.Add(imageColumn, typeof(byte[]));

       // varre as linhas da tabela para preencher a imagem...
       foreach (DataRow row in table.Rows)
       {
        // pega a url...
        string url = Convert.ToString(row[urlColumn]);
        // faz o download...
        byte[] imageData = client.DownloadData(url);
        // seta o valor da tabela...
        row[imageColumn] = imageData;
       }
      }


        End Sub
    End Class

    sexta-feira, 17 de dezembro de 2010 17:56
  • É porque tinha mandado o código em c#, segue em VB:

      Private Sub LoadImages(ByVal table As DataTable, ByVal imageColumn As String, ByVal urlColumn As String)
    
        ' cria e configura o webclient...
        Dim client As System.Net.WebClient = New System.Net.WebClient()
        client.Proxy = System.Net.HttpWebRequest.GetSystemWebProxy()
        client.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials
    
        ' adiciona a coluna da imagem na tabela...
        table.Columns.Add(imageColumn, GetType(Byte()))
    
        ' varre as linhas da tabela para preencher a imagem...
        For Each row As DataRow In table.Rows
          ' pega a url...
          Dim url As String = Convert.ToString(row(urlColumn))
          ' faz o download...
          Dim imageData() As Byte = client.DownloadData(url)
          ' seta o valor da tabela...
          row(imageColumn) = imageData
    
        Next
    
      End Sub
    
    

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 18:18
  • Neste codigo tenho que alterar alguma coisa??

     

    Neste momento o url aparece no Campo 5 do datagrid, tenho que alterar esse campo para campo de imagem no datagrid?

    sexta-feira, 17 de dezembro de 2010 18:23
  • No seu caso, poderia ficar assim:

    Public Class Form4
    
      Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'ColaboradoresDataSet.Colaboradores' table. You can move, or remove it, as needed.
    
        Me.ColaboradoresTableAdapter.Fill(Me.ColaboradoresDataSet.Colaboradores)
        Me.LoadImages(Me.ColaboradoresDataSet.Colaboradores, "campo5", "campoimagem")
    
    
      End Sub
    End Class
    
    
    

    Você deve adicionar uma coluna no grid do tipo imagem associada ao campoimagem. Ou setar o AutoGenerateColumns para true para que ela seja criada automaticamente.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 18:41
  • Criei um campo na base de dados chamado campoimagem e criei um campo no datagrid chamado campoimagem e formatei-o para campo de imagem.

    O codigo ficou da seguinte forma:

     

    Public Class Form4

        Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'TODO: This line of code loads data into the 'ColaboradoresDataSet.Colaboradores' table. You can move, or remove it, as needed.
            Me.ColaboradoresTableAdapter.Fill(Me.ColaboradoresDataSet.Colaboradores)
            'PictureBox1.DataBindings.Add("ImageLocation", Me.ColaboradoresDataSet.Colaboradores, "Campo5")
            Me.LoadImages(Me.ColaboradoresDataSet.Colaboradores, "campo5", "campoimagem")


        End Sub
        Private Sub LoadImages(ByVal table As DataTable, ByVal imageColumn As String, ByVal urlColumn As String)

            ' cria e configura o webclient...
            Dim client As System.Net.WebClient = New System.Net.WebClient()
            client.Proxy = System.Net.HttpWebRequest.GetSystemWebProxy()
            client.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials

            ' adiciona a coluna da imagem na tabela...
            table.Columns.Add(imageColumn, GetType(Byte()))

            ' varre as linhas da tabela para preencher a imagem...
            For Each row As DataRow In table.Rows
                ' pega a url...
                Dim url As String = Convert.ToString(row("Campo5"))
                ' faz o download...
                Dim imageData() As Byte = client.DownloadData(url)
                ' seta o valor da tabela...
                row(imageColumn) = imageData

            Next

        End Sub



    End Class

     

     

    Mas na imagem aparece um X :S O que esta mal?

    sexta-feira, 17 de dezembro de 2010 18:57
  • Flashed,

    Você não precisa criar o campo na base dados, ele é criado dinamicamente pela rotina que te enviei com este código:

      table.Columns.Add(imageColumn, GetType(Byte()))
    

    Você tem só que adicionar a coluna no Grid caso você crie as colunas em design-time e não use o AutoGenerateColumns.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 19:05
  • Então o codigo esta bem?

     

    Apaguei a coluna na bd mas mesmo assim ainda na parece a imagem no campo imagem do datagrid.

    sexta-feira, 17 de dezembro de 2010 19:07
  • Pode ser que você não tenha setado a propriedade DataPropertyName da coluna, ela também deve ser informada, tente colocar assim:

    Me.ColaboradoresTableAdapter.Fill(Me.ColaboradoresDataSet.Colaboradores)
    
    Me.LoadImages(Me.ColaboradoresDataSet.Colaboradores, "campo5", "campoimagem")
    
    Me.grid.Columns("campoimagem").DataPropertyName = "campoimagem"
    

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    sexta-feira, 17 de dezembro de 2010 19:17
  • da.me este erro:

     

    Error    1    'grid' is not a member of 'WindowsApplication1.Form4'

     

    Como é que eu declaro isto?

    sexta-feira, 17 de dezembro de 2010 19:19
  • será assim?

    Me.DataGridView1.Columns("campoimagem").DataPropertyName = "campoimagem"

     

    Mas a imagem não aparece..aparece na mesma o X.

    "campoimagem" este é o nome da coluna que criei no datagrid..fica assim ne?

    sexta-feira, 17 de dezembro de 2010 19:27
  • Flashed,

    Eu fiz um teste simples aqui, coloque em um form um grid, e um botão e coloque este código:

      Private Sub LoadImages(ByVal table As DataTable, ByVal imageColumn As String, ByVal urlColumn As String)
    
        ' cria e configura o webclient...
        Dim client As System.Net.WebClient = New System.Net.WebClient()
        client.Proxy = System.Net.HttpWebRequest.GetSystemWebProxy()
        client.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials
    
        ' adiciona a coluna da imagem na tabela...
        table.Columns.Add(imageColumn, GetType(Byte()))
    
        ' varre as linhas da tabela para preencher a imagem...
        For Each row As DataRow In table.Rows
          ' pega a url...
          Dim url As String = Convert.ToString(row(urlColumn))
          ' faz o download...
          Dim imageData() As Byte = client.DownloadData(url)
          ' seta o valor da tabela...
          row(imageColumn) = imageData
    
        Next
    
      End Sub
    
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
        ' cria a tabela
        Dim table As DataTable = New DataTable("Tabela")
        table.Columns.Add("URL", GetType(String))
    
        ' preenche os dados...
        table.Rows.Add("http://i.microsoft.com/global/en/publishingimages/sitebrand/microsoft.gif")
        table.Rows.Add("http://www.seeklogo.com/images/T/TOTVS-logo-E1C4543ADA-seeklogo.com.gif")
    
        ' carrega as imagens...
        LoadImages(table, "imagem", "URL")
    
        ' seta o grid...
        DataGridView1.DataSource = table
    
      End Sub
    

    Você vai ver que funciona corretamente, o seu problema deve estar relacionado a url da imagem não ser válida ou você está fazendo alguma coisa diferente do que te passei.

    at.,


    Rogério de Resende Ohashi | Ohashi.NET (.NET, Security, C#, WinForms, WCF, Workflow, Azure, Windows Phone, Mono)
    • Marcado como Resposta Jonas São Paulo segunda-feira, 20 de dezembro de 2010 09:17
    sexta-feira, 17 de dezembro de 2010 19:47
  • MAs fazo a ligação do grid a base de dados?

     

     ' preenche os dados...
      table.Rows.Add("http://i.microsoft.com/global/en/publishingimages/sitebrand/microsoft.gif")
      table.Rows.Add("http://www.seeklogo.com/images/T/TOTVS-logo-E1C4543ADA-seeklogo.com.gif")

    Aki preencho com o meu url? Eu tenho vários url´s....

    sexta-feira, 17 de dezembro de 2010 21:46
  • Boas


    Rogério o seu código funciona bem..mas só carrega as imagens das url´s que escrever no código! não é isso que pretendo.


    O que pretendo é que o url que tenho no campo 5 da minha base de dados seja carregado e mostre a imagem no meu datagrid.


    O meu código é o seguinte:


    Public Class Form4

        Private Sub Form4_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            'TODO: This line of code loads data into the 'ColaboradoresDataSet.Colaboradores' table. You can move, or remove it, as needed.
            Me.ColaboradoresTableAdapter.Fill(Me.ColaboradoresDataSet.Colaboradores)
            'PictureBox1.DataBindings.Add("ImageLocation", Me.ColaboradoresDataSet.Colaboradores, "Campo5")
            Me.LoadImages(Me.ColaboradoresDataSet.Colaboradores, "campo5", "campoimagem")
            Me.DataGridView1.Columns("campoimagem").DataPropertyName = "campoimagem"


        End Sub

        Private Sub LoadImages(ByVal table As DataTable, ByVal imageColumn As String, ByVal urlColumn As String)

            ' cria e configura o webclient...
            Dim client As System.Net.WebClient = New System.Net.WebClient()
            client.Proxy = System.Net.HttpWebRequest.GetSystemWebProxy()
            client.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials

            ' adiciona a coluna da imagem na tabela...
            table.Columns.Add(imageColumn, GetType(Byte()))

            ' varre as linhas da tabela para preencher a imagem...
            For Each row As DataRow In table.Rows
                ' pega a url...
                Dim url As String = Convert.ToString(row("Campo5"))
                ' faz o download...
                Dim imageData() As Byte = client.DownloadData(url)
                ' seta o valor da tabela...
                row(imageColumn) = imageData

            Next

        End Sub
      

    End Class

    Acho que estamos a ter problemas na parte de pegar o url da bd e carregar a imagem para o datagrid...O que acha?
    sábado, 18 de dezembro de 2010 21:06
  • Alguem ai?
    terça-feira, 21 de dezembro de 2010 13:41