Como posso Transferir uma imagem de um controle picturebox para o outro? VB.NET & SQL

0

Pergunta

Estou tentando fazer um sistema de login onde eu armazenar as credenciais e um perfil desejado pic imagem em um banco de dados do access. o resultado desejado é que, quando o login corresponde formulário 1 fecha e abre formulário 2 com a imagem guardada carregado em um canto.

eu tentei fazer isso

Formulário 1 código:

Imports System.Data.OleDb
Imports System.IO
Public Class Form1

    Private PictureFormat As String

    Private Sub FillPictureBoxFromFile()
        With OpenFileDialog1
            .Filter = "(*.jpg)|*.jpg|(*.png)|*.png"
            .RestoreDirectory = True
            .Title = "Select a file to open"
            If .ShowDialog = DialogResult.OK Then
                PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
            End If
            PictureFormat = Path.GetExtension(OpenFileDialog1.FileName)
        End With
    End Sub

    Private cnStr As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\geral\source\repos\Login Fase 3 Final\Login Fase 3 Final\bin\Release\DBLoginPic.mdb"

    Private Sub saveimage()
        Dim arrimage() As Byte
        Using mstream As New System.IO.MemoryStream
            If PictureFormat.ToLower = ".png" Then
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Png)
            ElseIf PictureFormat.ToLower = ".jpg" Then
                PictureBox1.Image.Save(mstream, System.Drawing.Imaging.ImageFormat.Jpeg)
            End If
            arrimage = mstream.GetBuffer()
            Dim Filesize As Long
            Filesize = mstream.Length
        End Using
        Using con As New OleDbConnection(cnStr),
                cmd As New OleDbCommand("Insert into TBLoginPic (Imagen) Values (@Imagen)", con)
            With cmd
                .Parameters.Add("@Imagen", OleDbType.Binary).Value = arrimage
                '.Parameters.Add("@Nombre", OleDbType.VarChar).Value = TextBox1.Text
                con.Open()
                .ExecuteNonQuery()
            End With
        End Using
    End Sub

    Private Function GetDataByName(name As String) As DataTable
        Dim dt As New DataTable
        Using conn As New OleDb.OleDbConnection(cnStr),
                cmd As New OleDbCommand("Select * from TBLoginPic where Usuario= @Buscar", conn)
            cmd.Parameters.Add("@Buscar", OleDbType.VarChar).Value = TBusuario.Text
            conn.Open()
            Using reader = cmd.ExecuteReader
                dt.Load(reader)
            End Using
        End Using
        Return dt
    End Function


    Private Sub Label2_Click(sender As Object, e As EventArgs) Handles Label2.Click

    End Sub

    Private Sub TBusuario_TextChanged(sender As Object, e As EventArgs) Handles TBusuario.TextChanged

    End Sub

    Private Sub TBcontraseña_TextChanged(sender As Object, e As EventArgs) Handles TBcontraseña.TextChanged

    End Sub

    Private Sub BtnLoguearse_Click(sender As Object, e As EventArgs) Handles BtnLoguearse.Click
        If Me.TBLoginPicTableAdapter.BuscarDatos(Me.DBLoginPicDataSet.TBLoginPic, TBusuario.Text, TBcontraseña.Text) Then

            Dim dt As DataTable
            Try
                dt = GetDataByName(TBusuario.Text)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Exit Sub
            End Try

            TBusuario.Text = dt(0)("Usuario").ToString
            Dim arrimage = DirectCast(dt(0)("Imagen"), Byte())
            Dim mstream As New System.IO.MemoryStream(arrimage)
            PictureBox1.Image = Image.FromStream(mstream)

            Form2.Show()
            _selectedImage = PictureBox1.Image
            Me.Close()
        Else
            MsgBox("Datos Erroneos")
        End If
    End Sub

    Private Sub BtnRegistrarse_Click(sender As Object, e As EventArgs) Handles BtnRegistrarse.Click


        Me.TBLoginPicBindingSource.AddNew()
        Me.TBLoginPicBindingSource.EndEdit()
        Me.TBLoginPicTableAdapter.Update(Me.DBLoginPicDataSet)


        Try
            saveimage()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Exit Sub
        End Try
        MsgBox("Image has been saved in the database")

    End Sub

    Private Sub BtnExaminar_Click(sender As Object, e As EventArgs) Handles BtnExaminar.Click
        FillPictureBoxFromFile()
    End Sub

    Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'DBLoginPicDataSet.TBLoginPic' table. You can move, or remove it, as needed.
        Me.TBLoginPicTableAdapter.Fill(Me.DBLoginPicDataSet.TBLoginPic)



    End Sub

    Private Sub TBLoginPicBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs)
        Me.Validate()
        Me.TBLoginPicBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.DBLoginPicDataSet)

    End Sub
End Class

Formulário 2 Código:

Module imagen
    Public _selectedImage As Image
    Public ReadOnly Property SelectedImage As Image
        Get
            Return _selectedImage
        End Get
    End Property
End Module

Public Class Form2



    Private Sub TBLoginPicBindingNavigatorSaveItem_Click(sender As Object, e As EventArgs)
        Me.Validate()
        Me.TBLoginPicBindingSource.EndEdit()
        Me.TableAdapterManager.UpdateAll(Me.DBLoginPicDataSet)

    End Sub

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'DBLoginPicDataSet.TBLoginPic' table. You can move, or remove it, as needed.
        Me.TBLoginPicTableAdapter.Fill(Me.DBLoginPicDataSet.TBLoginPic)
        _selectedImage = PBPerfil.Image

    End Sub

    Public Sub PBPerfil_Click(sender As Object, e As EventArgs) Handles PBPerfil.Click

    End Sub
End Class

e receber esse erro

Do sistema.InvalidCastException: 'não é Possível converter objeto do tipo 'System.DBNull' para o tipo 'System.Byte[]'.'

Esta é a forma como o formulário 1 parece

Esta é a forma como o formulário 2 parece

Esta é a forma como a minha base de dados parece (não se preocupe, não há qualquer informação pessoal aqui))

Este é o lugar onde eu tente enviá-la a partir do formulário 1 a 2

Isto é como eu estou tentando para recebê-lo no formulário 2

todas as dicas sobre o que eu poderia fazer melhor?

database forms image picturebox
2021-11-24 05:29:42
1

Melhor resposta

0

Você precisa verificar para valores nulos. Se não houver dados na coluna de imagem que vai de erro quando você tenta manipulá-lo. Eu gostaria de sugerir que você selecionou uma imagem padrão a ser exibido se nenhum estiver presente no banco de dados.

    If dt(0)("Usuario") IsNot Nothing OrElse Not IsDBNull(dt(0)("Usuario")) Then
        TBusuario.Text = dt(0)("Usuario").ToString
        Dim arrimage = DirectCast(dt(0)("Imagen"), Byte())
        Dim mstream As New System.IO.MemoryStream(arrimage)
        PictureBox1.Image = Image.FromStream(mstream)
    Else
        PictureBox1.Image = Image.FromFile("DefaultImage.png")
    End If
2021-11-24 08:18:30

como posso adicionar uma imagem como essa? preciso colocar um caminho semelhante a uma cadeia de ligação como esta: Provider=Microsoft.Jet.O OLEDB.4.0;Data Source=C:\Users\geral\source\repos\Login Fase 3 Final\Login Fase 3 Final\bin\Release\DBLoginPic.mdb. ou posso simplesmente colocar um caminho de arquivo lá? ou existe outra forma?
THEwed123wet

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................