Minino666 Posted December 20, 2011 Report Share Posted December 20, 2011 Resulta que estoy tratando de cargar imagines, desde una base de datos a un formulario en tiempo de ejecución, tengo 2 picturebox y necesito cargar imágenes almacenadas en la BD por su ID, solo puedo cargar 1 sola imagen y el segundo picturebox vació, Intente otras cosas pero me cargo la misma imagen en los 2 picturebox. Espero que se entienda la idea. BD ID Image Nombre1 imagen.jpg rojo2 imagen2.jpg verde Es poder cargar en picturebox1 = la imagen rojay en el picturebox2 = la imagen verde Ambas simultáneamente. Desde ya estoy agradecido, saludos. Link to comment Share on other sites More sharing options...
AshWilliams Posted December 22, 2011 Report Share Posted December 22, 2011 Podrías partir mostrando el código donde carga las imágenes...es posible que estés poniendo el mismo dato o que por error hayas subido la misma foto 2 veces a tu BD. Postea el código. Saludos :krider: Link to comment Share on other sites More sharing options...
Minino666 Posted December 26, 2011 Author Report Share Posted December 26, 2011 Adjunto código. Option Strict On Imports Microsoft.VisualBasic Imports System.Data Imports System.IO Imports System.Drawing Public Class TablaNavegar Private laTabla As DataTable Private laFila As Integer Private ReadOnly Property totalFilas() As Integer Get Return laTabla.Rows.Count - 1 End Get End Property ''' <summary> ''' El constructor que recibe la tabla a usar ''' </summary> ''' <param name="tabla"> ''' La tabla por la que se navegará ''' </param> ''' <remarks> ''' 20/Feb/2007 ''' </remarks> Public Sub New(ByVal tabla As DataTable) laTabla = tabla laFila = 0 'totalFilas = tabla.Rows.Count - 1 End Sub Public Sub ActualizarTabla(ByVal tabla As DataTable) laTabla = tabla 'totalFilas = tabla.Rows.Count - 1 If laFila > totalFilas Then laFila = totalFilas End If If laFila < 0 Then laFila = 0 End If End Sub ' Los cuatro métodos para navegar por las filas Public Function Primera() As DataRow laFila = 0 Return laTabla.Rows(laFila) End Function Public Function Ultima() As DataRow laFila = totalFilas Return laTabla.Rows(laFila) End Function Public Function Siguiente() As DataRow laFila += 1 If laFila > totalFilas Then laFila = totalFilas End If Return laTabla.Rows(laFila) End Function Public Function Anterior() As DataRow laFila -= 1 If laFila < 0 Then laFila = 0 End If Return laTabla.Rows(laFila) End Function ''' <summary> ''' Devuelve un DataRow con la fila actual. ''' </summary> ''' <value> ''' Devuelve un DataRow con la fila actual ''' </value> ''' <returns> ''' Un objeto DataRow con la fila actual. ''' </returns> ''' <remarks></remarks> Public ReadOnly Property FilaActual() As DataRow Get If Me.totalFilas >= 0 Then Return laTabla.Rows(laFila) Else Return Nothing End If End Get End Property ''' <summary> ''' Propiedad de solo lectura que devuelve ''' el índidce de la fila actual. ''' </summary> ''' <value> ''' El índice de la fila actual ''' </value> ''' <returns> ''' El valor del índice de la fila actual. ''' </returns> ''' <remarks> ''' 20/Feb/2007 ''' </remarks> Public ReadOnly Property NumeroFilaActual() As Integer Get Return laFila End Get End Property ''' <summary> ''' Propiedad de solo lectura que devuelve ''' el índice de la última fila. ''' </summary> ''' <value> ''' El índice de la última fila ''' </value> ''' <returns> ''' El valor del índice de la última fila. ''' </returns> ''' <remarks> ''' 20/Feb/2007 ''' </remarks> Public ReadOnly Property NumeroUltimaFila() As Integer Get Return totalFilas End Get End Property ''' <summary> ''' Indizador que devuelve la fila indicada ''' </summary> ''' <param name="index"> ''' El índice de la fila a devolver. ''' El índice indicado no altera el valor del número de la fila actual. ''' </param> ''' <value> ''' La fila con el índice indicado. ''' </value> ''' <returns> ''' Un objeto DataRow con la fila indicada. ''' </returns> ''' <remarks> ''' 20/Feb/2007 ''' </remarks> Default Public ReadOnly Property Item(ByVal index As Integer) As DataRow Get If index < 0 Then index = 0 End If If index > totalFilas Then index = totalFilas End If Return laTabla.Rows(index) End Get End Property ' Métodos compartidos Public Shared Function Image2Bytes(ByVal img As Image) As Byte() Dim sTemp As String = Path.GetTempFileName() Dim fs As New FileStream(sTemp, FileMode.OpenOrCreate, FileAccess.ReadWrite) img.Save(fs, System.Drawing.Imaging.ImageFormat.Png) ' Cerrarlo y volverlo a abrir ' o posicionarlo en el primer byte 'fs.Close() 'fs = New FileStream(sTemp, FileMode.Open, FileAccess.Read) fs.Position = 0 ' Dim imgLength As Integer = CInt(fs.Length) Dim bytes(0 To imgLength - 1) As Byte fs.Read(bytes, 0, imgLength) fs.Close() Return bytes End Function Public Shared Function Bytes2Image(ByVal bytes() As Byte) As Image If bytes Is Nothing Then Return Nothing ' Dim ms As New MemoryStream(bytes) Dim bm As Bitmap = Nothing Try bm = New Bitmap(ms) Catch ex As Exception System.Diagnostics.Debug.WriteLine(ex.Message) End Try Return bm End Function End Class Form1 Imports System.Data Imports System.Data.SqlClient Public Class Form1 'Private cnnStr As String = "Data Source=.\SQLEXPRESS; Initial Catalog=conImagenesSQL;Integrated Security=True;" Private cnnStr As String = "Data Source=.\SQLEXPRESS; Initial Catalog=conImagenes2;Integrated Security=True;" Private dt As New DataTable Private dtNavegador As TablaNavegar Private Sub habilitarControles(ByVal habilitar As Boolean) ' Habilitar/deshabilitar los controles según se indique Me.BindingNavigatorDeleteItem.Enabled = habilitar Me.BindingNavigatorMoveFirstItem.Enabled = habilitar Me.BindingNavigatorMoveLastItem.Enabled = habilitar Me.BindingNavigatorMoveNextItem.Enabled = habilitar Me.BindingNavigatorMovePreviousItem.Enabled = habilitar End Sub Private Sub actualizarNavegacion() ' Actualizar los controles de navegación actualizarNavegacion(True) End Sub Private Sub actualizarNavegacion(ByVal mostrarFila As Boolean) ' Actualizar los controles de navegación ' Si mostrarFila = True se muestra la fila actual Me.IDTextBox.Text = "" Me.NombreTextBox.Text = "" Me.FotoPictureBox.Image = Nothing If mostrarFila AndAlso dtNavegador.NumeroUltimaFila >= 0 Then Dim dr As DataRow = dtNavegador.FilaActual If dr IsNot Nothing Then Me.IDTextBox.Text = dr("ID").ToString Me.NombreTextBox.Text = dr("Nombre").ToString If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.FotoPictureBox.Image = img Me.clon.Image = img 'Else ' img = TryCast(dr("Foto"), Bitmap) ' If img IsNot Nothing Then ' Me.FotoPictureBox.Image = img ' End If End If End If End If End If habilitarControles(False) If dtNavegador.NumeroUltimaFila >= 0 Then BindingNavigatorPositionItem.Text = (dtNavegador.NumeroFilaActual + 1).ToString BindingNavigatorCountItem.Text = "de " & (dtNavegador.NumeroUltimaFila + 1).ToString 'habilitarControles(True) If dtNavegador.NumeroFilaActual > 0 Then Me.BindingNavigatorMoveFirstItem.Enabled = True Me.BindingNavigatorMovePreviousItem.Enabled = True End If If dtNavegador.NumeroFilaActual < dtNavegador.NumeroUltimaFila Then Me.BindingNavigatorMoveLastItem.Enabled = True Me.BindingNavigatorMoveNextItem.Enabled = True End If Else BindingNavigatorPositionItem.Text = "0" BindingNavigatorCountItem.Text = "de 0" End If End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.IDTextBox.Enabled = False habilitarControles(False) Dim da As New SqlDataAdapter("SELECT * FROM conFotos", cnnStr) Try da.Fill(dt) dtNavegador = New TablaNavegar(dt) actualizarNavegacion(True) Catch ex As Exception MessageBox.Show("ERROR al cargar los datos:" & vbCrLf & _ ex.Message, "Error al cargar los datos", _ MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 'Exit Sub End Try End Sub Private Sub ConFotosBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConFotosBindingNavigatorSaveItem.Click ' Guardar los datos en la tabla Dim da As New SqlDataAdapter("SELECT * FROM conFotos", cnnStr) Try Dim cb As New SqlCommandBuilder(da) da.UpdateCommand = cb.GetUpdateCommand(True) da.InsertCommand = cb.GetInsertCommand(True) da.DeleteCommand = cb.GetDeleteCommand(True) da.Update(dt) dt.AcceptChanges() Catch ex As Exception MessageBox.Show("ERROR al guardar los datos:" & vbCrLf & _ ex.Message, "Error al guardar los datos", _ MessageBoxButtons.OK, MessageBoxIcon.Exclamation) End Try End Sub Private Sub BindingNavigatorAddNewItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorAddNewItem.Click ' Agregar un nuevo elemento ' Se añade un nuevo registro y se muestra vacío Dim dr As DataRow = dt.NewRow dt.Rows.Add(dr) dtNavegador.ActualizarTabla(dt) dtNavegador.Ultima() actualizarNavegacion(True) End Sub Private Sub BindingNavigatorDeleteItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorDeleteItem.Click End Sub Private Sub BindingNavigatorMoveFirstItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveFirstItem.Click dtNavegador.Primera() actualizarNavegacion(True) End Sub Private Sub BindingNavigatorMovePreviousItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMovePreviousItem.Click dtNavegador.Anterior() actualizarNavegacion(True) End Sub Private Sub BindingNavigatorMoveNextItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveNextItem.Click dtNavegador.Siguiente() actualizarNavegacion(True) End Sub Private Sub BindingNavigatorMoveLastItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BindingNavigatorMoveLastItem.Click dtNavegador.Ultima() actualizarNavegacion(True) End Sub Private Sub ConFotosActualizar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ConFotosActualizar.Click ' Actualizar los datos actuales en la fila actual Dim dr As DataRow = dtNavegador.FilaActual If dr Is Nothing Then dr = dt.NewRow dt.Rows.Add(dr) dtNavegador.ActualizarTabla(dt) End If dr("Nombre") = Me.NombreTextBox.Text dr("Foto") = TablaNavegar.Image2Bytes(Me.FotoPictureBox.Image) End Sub Private Sub btnExaminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExaminar.Click ' Seleccionar la imagen Dim oFD As New OpenFileDialog oFD.Title = "Selecccionar la imagen" oFD.Filter = "Todos (*.*)|*.*|Imagenes|*.jpg;*.gif;*.png;*.bmp" If oFD.ShowDialog = Windows.Forms.DialogResult.OK Then ' La cantidad de caracteres máximo ' (por si el path es demasiado largo) Dim i As Integer = dt.Columns("Nombre").MaxLength If i < 0 Then i = 255 ' El nombre del fichero ' Nos quedamos solo con el nombre, sin el path Dim sNombre As String = System.IO.Path.GetFileName(oFD.FileName) If sNombre.Length > i Then ' Si el nombre es más grande de lo permitido, lo cortamos sNombre = sNombre.Substring(0, i) End If Me.NombreTextBox.Text = sNombre Me.FotoPictureBox.Image = Image.FromFile(oFD.FileName) End If End Sub Private Sub btnMostrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMostrar.Click My.Forms.FormMostrar.CadenaConexion = cnnStr My.Forms.FormMostrar.Show() End Sub End Class En la siguiente Linea copio solamente la misma imagen el el picturebox clone Me.FotoPictureBox.Image = imgMe.clon.Image = img Pero mi intención es capturar id distintas en ambos picturebox. Saludos Link to comment Share on other sites More sharing options...
AshWilliams Posted December 27, 2011 Report Share Posted December 27, 2011 (edited) Algo asi sería??: If dr IsNot Nothing Then Me.IDTextBox.Text = dr("ID").ToString Me.NombreTextBox.Text = dr("Nombre").ToString If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.FotoPictureBox.Image = img 'Else ' img = TryCast(dr("Foto"), Bitmap) ' If img IsNot Nothing Then ' Me.FotoPictureBox.Image = img ' End If End If End If If dr("FotoB") IsNot DBNull.Value Then Dim imgb As Image = TablaNavegar.Bytes2Image(CType(dr("FotoB"), Byte())) If imgb IsNot Nothing Then Me.clon.Image = imgb 'Else ' img = TryCast(dr("Foto"), Bitmap) ' If img IsNot Nothing Then ' Me.FotoPictureBox.Image = img ' End If End If End If End If Eso suponiendo que tu primera foto se llame Foto y tu segunda foto se llamase FotoB en tu BD. Saludos :krider: Edited December 27, 2011 by AshWilliams Link to comment Share on other sites More sharing options...
Minino666 Posted December 27, 2011 Author Report Share Posted December 27, 2011 (edited) Intento y comento ;) , salu2 Edito: Me tira un error. "ERROR al cargar datos, La columna 'FotoB' no pertenece a la tabla. Mi Base dato tiene los siguientes campos. ID (con identidad) Nombre Foto(Image, esta ultima almacena las imágenes en dato binario) El problema por el cual reclama es porque no existe la Columna FotoB. Quiero saber como puedo cargar la imagen de la misma columna Foto pero con la siguiente ID. Edited December 27, 2011 by Minino666 Link to comment Share on other sites More sharing options...
Ra Posted December 28, 2011 Report Share Posted December 28, 2011 En el conjunto de resultados (DataTable) tienes 2 filas (tuplas) para cada foto... porque son ID distintos... El mismo ejemplo que pusiste: ID Image Nombre1 imagen.jpg rojo2 imagen2.jpg verde Cuando haces la asignación, el dr corresponde a la fila con ID 1... Por lo tanto, para sacar la otra foto, tienes q asignarle al dr, la siguiente fila. Dim dr As DataRow = dtNavegador.FilaActual If dr IsNot Nothing Then Me.IDTextBox.Text = dr("ID").ToString Me.NombreTextBox.Text = dr("Nombre").ToString If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.FotoPictureBox.Image = img End If Dim dr As DataRow = dtNavegador.Siguiente() If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.clon.Image = img End If End If End If O algo así... Suerte! ;) Link to comment Share on other sites More sharing options...
AshWilliams Posted December 29, 2011 Report Share Posted December 29, 2011 En el conjunto de resultados (DataTable) tienes 2 filas (tuplas) para cada foto... porque son ID distintos... El mismo ejemplo que pusiste: ID Image Nombre1 imagen.jpg rojo2 imagen2.jpg verde Cuando haces la asignación, el dr corresponde a la fila con ID 1... Por lo tanto, para sacar la otra foto, tienes q asignarle al dr, la siguiente fila. Dim dr As DataRow = dtNavegador.FilaActual If dr IsNot Nothing Then Me.IDTextBox.Text = dr("ID").ToString Me.NombreTextBox.Text = dr("Nombre").ToString If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.FotoPictureBox.Image = img End If Dim dr As DataRow = dtNavegador.Siguiente() If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.clon.Image = img End If End If End If O algo así... Suerte! ;) Gracias Ra por la corrección, yo pensaba que tenías 2 fotos por ID, pero si es con ids distintos y fotos distintas el ejemplo citado debería funcionar. Saludos :krider: Link to comment Share on other sites More sharing options...
Minino666 Posted January 3, 2012 Author Report Share Posted January 3, 2012 (edited) Gracias RA y AshWillians por contestar, eh probado pero me causa un error de código en la siguiente linea. Dim dr As DataRow = dtNavegador.FilaActual If dr IsNot Nothing Then Me.IDTextBox.Text = dr("ID").ToString Me.NombreTextBox.Text = dr("Nombre").ToString If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.FotoPictureBox.Image = img End If [color=#ff0000][b] Dim dr As DataRow = dtNavegador.Siguiente()[/b][/color] If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.clon.Image = img End If End If End If La Variable local 'dr' ya se ah declarado en el bloque actual. Probe renombrado la segundar parte del código donde apunta a siguiente con otra variable ejm 'dr2' pero sin efecto. EDIT. Intente con 2 formas lo primero eliminar que se haya declarado la variable 2 veces. dr = dtNavegador.Siguiente() Pero se generan muchos problemas, no guarda ni respeta el indice. la segunda opcion fue ingresar el codigo en un button. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim dr As DataRow = dtNavegador.Siguiente If dr IsNot Nothing Then Me.IDTextBox.Text = dr("ID").ToString Me.NombreTextBox.Text = dr("Nombre").ToString If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.clon.Image = img End If End If End If End Sub Lo cual captura el elemento siguiente al anterior, pero como cargar ambos elementos a la vez? ya que me hace depender de un button. Edited January 3, 2012 by Minino666 Link to comment Share on other sites More sharing options...
Ra Posted January 3, 2012 Report Share Posted January 3, 2012 (edited) Claro... lo que pasa es que el método Siguiente() hace que el índice aumente en 1... Podrías hacer un nuevo método en la clase TablaNavegar que te traiga la siguiente fila, pero sin aumentar el índice... Puede ser algo así: Public Function SiguienteNoMove() As DataRow Return laTabla.Rows(laFila + 1) End Function Y la usas así: Dim dr As DataRow = dtNavegador.FilaActual If dr IsNot Nothing Then Me.IDTextBox.Text = dr("ID").ToString Me.NombreTextBox.Text = dr("Nombre").ToString If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.FotoPictureBox.Image = img End If dr = dtNavegador.SiguienteNoMove() If dr("Foto") IsNot DBNull.Value Then Dim img As Image = TablaNavegar.Bytes2Image(CType(dr("Foto"), Byte())) If img IsNot Nothing Then Me.clon.Image = img End If End If Salu2. Edited January 3, 2012 by Ra Link to comment Share on other sites More sharing options...
Minino666 Posted January 3, 2012 Author Report Share Posted January 3, 2012 (edited) Gracias RA, funciono tal cual lo necesitaba. Una ultima consulta es posible capturar una imagen X en la fila y cargarla en un 3er Picturebox. Es tan facil como tener un textbox y comprarlo?? if (Textbox.text = laFila) Para capturar una imagen que yo desee. Re-itero Muchas gracias otra vez. Problemas solucionados , Gracias RA y AshWilliams por todas las ayudas ;) Edited January 3, 2012 by Minino666 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now