WPF -  Salvando e Recuperando imagens em um Banco de dados - III


 Neste artigo eu vou mostrar como podemos armazenar e recuperar imagens em um banco de dados SQL Server em uma aplicação WPF usando a linguagem VB .NET.

Na segunda parte do artigo implementei as funcionalidades para salvar imagens e nesta última parte do artigo eu vou definir a janela RecuperarImagem.xaml onde irei implementar as funcionalidades para recuperar e exibir as imagens salvas no banco de dados.

O projeto utiliza 3 Windows (arquivos .xaml). Você não deve confundir Page com Windows em uma aplicação WPF.

As páginas WPF podem ser usadas para aplicativos de navegador XAML, você também pode carregá-las em seu próprio aplicativo usando o controle Frame, ou você pode usar um NavigationWindow e criar o equivalente a um navegador como aplicativo. Assim uma Page não é independente e geralmente é visualizada em um container.

As Janelas WPF são janelas normais WPF que podem hospedar páginas usando um Frame. As janelas podem ser exibidas de forma independente.

Recursos usados:

Implementando as funcionalidades para recuperar e exibir as imagens salvas

Abra o projeto criado na primeira parte do artigo e a seguir abra o arquivo RecuperarImagem.xaml e inclua os seguintes controles a partir da ToolBox:

Defina os controles conforme o leiaute da figura abaixo

O código XAML gerado é visto abaixo:

<Window x:Class="RecuperarImagem"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Recuperar Imagens" Height="500" Width="680"  WindowStartupLocation="CenterScreen">
    <Grid Background="LightGreen">
        <ListBox x:Name="lstbImagens" HorizontalAlignment="Left" Height="385" Margin="10,44,0,0" VerticalAlignment="Top" Width="215"/>
        <Image x:Name="imgDados" HorizontalAlignment="Left" Height="386" Margin="247,43,0,0" VerticalAlignment="Top" Width="415"/>
        <Button x:Name="btnSair" Content="Sair" HorizontalAlignment="Left" Margin="150,434,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.32,1.3" Click="btnSair_Click"/>
    </Grid>
</Window>

Observe que a janela RecuperarImagem será exibida centralizada : WindowStartupLocation="CenterScreen" e que definimos o evento Click para o controle Button - btnSair.

Vamos declarar os seguintes namespaces que iremos usar nesta janela:

Imports Microsoft.Win32

Imports System.IO

Imports System.Data.SqlClient

Imports System.Data

 

Logo após a declaração da janela vamos definir uma variável con do tipo SqlConnection que será usada no projeto:

Dim con As SqlConnection = Nothing

Agora vamos definir o código no evento Window_Loaded da janela RecuperarImagem que ocorre quando a janela é carregada:

 Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
        Try
            con = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Cadastro;Integrated Security=True")
            con.Open()
            Dim dad As SqlDataAdapter = New SqlDataAdapter("Select imagemId, imagemNome from Imagens", con)
            Dim dst As New DataSet
            dad.Fill(dst, "ImgContainer")
            Dim datarow As DataRow
            For Each datarow In dst.Tables(0).Rows
                Dim lbitem As New ListBoxItem
                lbitem.Content = datarow(1).ToString
                lbitem.DataContext = datarow(0).ToString
                lstbImagens.Items.Add(lbitem)
            Next
        Catch ex As Exception
            MessageBox.Show(" Erro : " & ex.Message)
        Finally
            con.Close()
        End Try
    End Sub

Este código acessa o banco de dados Cadastro e executa uma instrução SQL - Select imagemId, imagemNome from Imagens - para recuperar as imagens armazenadas na tabela Imagens.

A seguir criamos um dataset e exibimos o nome da imagem recuperada no controle ListBox - lstbImagens.

Nosso objetivo é permitir que o usuário selecione uma imagem no controle ListBox e a mesma seja exibida no controle Image.

Para isso vamos definir o código abaixo no evento SelectionChanged do controle ListBox:   

Private Sub lstbImagens_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles lstbImagens.SelectionChanged
        ExibirImagem()
End Sub

Neste código cada item selecionado no controle ListBox irá chamar a rotina ExibirImagem() cujo código mostramos a seguir:

  Private Sub ExibirImagem()
        Try
            con = New SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=Cadastro;Integrated Security=True")
            Dim lbitem As ListBoxItem = TryCast(lstbImagens.SelectedItem, ListBoxItem)
            Dim dst As New DataSet
            con.Open()
            Dim dad As New SqlDataAdapter("Select Imagem from Imagens where imagemId='" + lbitem.DataContext.ToString + "'", con)
            dad.Fill(dst, "ImgContainer")
            Dim ImgSource() As Byte = DirectCast(dst.Tables(0).Rows(0)(0), Byte())
            Dim stream As MemoryStream = New MemoryStream()
            stream.Write(ImgSource, 0, ImgSource.Length - 1)
            stream.Seek(0, SeekOrigin.Begin)
            Dim bitmap As New BitmapImage
            bitmap.BeginInit()
            bitmap.StreamSource = stream
            bitmap.EndInit()
            If bitmap.Width < 390 Or bitmap.Height < 340 Then
                imgDados.Stretch = Stretch.None
                imgDados.VerticalAlignment = Windows.VerticalAlignment.Center
                imgDados.HorizontalAlignment = Windows.HorizontalAlignment.Center
                imgDados.Source = bitmap
            Else
                imgDados.Stretch = Stretch.Uniform
                imgDados.VerticalAlignment = Windows.VerticalAlignment.Center
                imgDados.HorizontalAlignment = Windows.HorizontalAlignment.Center
                imgDados.Source = bitmap
            End If
        Catch ex As Exception
            MessageBox.Show(" Erro : " & ex.Message)
        Finally
            con.Close()
        End Try
    End Sub

O código obtém o id da imagem selecionada e localiza a imagem na tabela imagem.

A seguir cria um stream com os dados da imagem e o atribui a um objeto do tipo BitmapImage para em seguida atribuir os dados ao controle Image e exibir a imagem selecionada:

Pegue o projeto completo aqui:  Wpf_GerenciaImagens.zip

Disse-lhes, pois, Jesus: Quando levantardes o Filho do homem, então conhecereis que EU SOU, e que nada faço por mim mesmo; mas isto falo como meu Pai me ensinou.
E aquele que me enviou está comigo. O Pai não me tem deixado só, porque eu faço sempre o que lhe agrada.

João 8:28-29
 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti