elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Llenar mas de un TextBox desde Base de Datos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Llenar mas de un TextBox desde Base de Datos  (Leído 2,608 veces)
SilverLycan68

Desconectado Desconectado

Mensajes: 10


Ver Perfil
Llenar mas de un TextBox desde Base de Datos
« en: 1 Junio 2018, 00:12 am »

Buenas tardes.
Necesito llenar 20 TextBox desde una tabla en MySQL en mas de una form.
Entonces hize una funcion, pero no se si sea la mejor forma de hacerlo.

Código
  1. Sub EscribirTextBox(ByVal fForm As Form, ByVal consulta As String)
  2.  
  3.        Dim objeto As Object
  4.        Try
  5.            command = New MySqlCommand(consulta, con)
  6.            reader = command.ExecuteReader
  7.  
  8.            If reader.Read Then
  9.                For Each objeto In fForm.Controls
  10.                    If TypeOf objeto Is TextBox Then
  11.                        CType(objeto, TextBox).Text = reader(CType(objeto, TextBox).Name.Substring(3))
  12.                        End If
  13.                    End If
  14.                Next
  15.            Else
  16.                MsgBox("Los datos no existen")
  17.            End If
  18.            reader.Close()
  19.  
  20.  
  21.        Catch ex As Exception
  22.            MsgBox("Error al escribir." + vbLf + ex.ToString)
  23.  
  24.        End Try
  25.  
  26.  
  27.    End Sub
  28.  

Por lo que he revisado no es recomendable usar Objet.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.866



Ver Perfil
Re: Llenar mas de un TextBox desde Base de Datos
« Respuesta #1 en: 1 Junio 2018, 02:10 am »

Yo le haría algunos cambios significativos. Prueba así:

Código
  1. <DebuggerStepThrough>
  2. Friend Shared Sub PopulateTextBoxValues(ByVal controlCollection As Control.ControlCollection,
  3.                                        ByVal query As String, ByVal connection As MySqlConnection)
  4.  
  5.    Dim owner As Control = controlCollection.Owner
  6.  
  7.    Try
  8.        Using command As New MySqlCommand(query, connection),
  9.              reader As MySqlDataReader = command.ExecuteReader()
  10.  
  11.            ' Do While (reader.Read())
  12.            ' ...
  13.            ' Loop
  14.  
  15.            If (reader.Read()) Then
  16.                For Each tb As TextBox In controlCollection.OfType(Of TextBox)
  17.                    Dim value As String = reader.GetString(tb.Name.Substring(3))
  18.                    tb.Text = value
  19.                Next tb
  20.  
  21.            Else
  22.                MessageBox.Show(owner, "Los datos no existen.", owner.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
  23.  
  24.            End If
  25.  
  26.        End Using
  27.  
  28.    Catch ex As Exception
  29.        Dim errorString As String = String.Format("Error al escribir. {0}", ex.Message)
  30.        MessageBox.Show(owner, errorString, owner.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
  31.  
  32.    End Try
  33.  
  34. End Sub

O de forma asincrónica si lo prefieres:
Código
  1. <DebuggerStepThrough>
  2. Friend Shared Async Sub PopulateTextBoxValuesAsync(ByVal controlCollection As Control.ControlCollection,
  3.                                                   ByVal query As String, ByVal connection As MySqlConnection)
  4.  
  5.    Dim owner As Control = controlCollection.Owner
  6.    owner.Invoke(Sub(ctrl As Control) ctrl.Enabled = False)
  7.  
  8.    Try
  9.        Using command As New MySqlCommand(query, connection),
  10.          reader As DbDataReader = Await command.ExecuteReaderAsync()
  11.            ' reader As MySqlDataReader = DirectCast(Await command.ExecuteReaderAsync(), MySqlDataReader)
  12.  
  13.            ' Do While Await (reader.ReadAsync())
  14.            ' ...
  15.            ' Loop
  16.  
  17.            If Await (reader.ReadAsync()) Then
  18.  
  19.                Dim lock As New Object()
  20.                SyncLock lock ' Safe thread synchronization.
  21.                    For Each tb As TextBox In controlCollection.OfType(Of TextBox)
  22.                        Dim value As String = CStr(reader(tb.Name.Substring(3)))
  23.                        ' If MySqlDataReader cast:
  24.                        ' Dim value As String = Await reader.GetFieldValueAsync(Of String)(Integer, Nothing)
  25.                        tb.BeginInvoke(Sub(x As TextBox) x.Text = value)
  26.                    Next tb
  27.                End SyncLock
  28.  
  29.            Else
  30.                MessageBox.Show(owner, "Los datos no existen.", owner.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
  31.  
  32.            End If
  33.  
  34.        End Using
  35.  
  36.    Catch ex As Exception
  37.        Dim errorString As String = String.Format("Error al escribir. {0}", ex.Message)
  38.        MessageBox.Show(owner, errorString, owner.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)
  39.  
  40.    Finally
  41.        owner.Invoke(Sub(ctrl As Control) ctrl.Enabled = True)
  42.  
  43.    End Try
  44.  
  45. End Sub

Por si no resulta evidente: a ambos métodos le pasarías la referencia del contenedor de controles, Form.Controls, en lugar de una referencia del Form.

PD: no he probado los códigos, los escribí al vuelo. En realidad no uso MySQL para nada, así que son códigos escritos/basados en pura intuición, en teoría deberían funcionar correctamente suponiendo que quieras que hagan lo mismo que el código original que compartiste (por si acaso dejé escrito y comentado un búcle Do-While que puedes adaptar).

Saludos


« Última modificación: 1 Junio 2018, 02:48 am por Eleкtro » En línea



Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Llenar mas de un TextBox desde Base de Datos
« Respuesta #2 en: 1 Junio 2018, 05:27 am »

Bueno, olvidas lo más importante y es que dices que quieres escribir en más de un formulario (que se ve que contienen controles textbox del mismo nombre?)...

No voy a entrar demasiado en señalar en que no es la forma más óptima... creo que si varios textbox aparecen por igual en varios formularios, podrías crear un contenedor (control de usuario), que puedas poner a cada uno de los formularios. Esto haría innecesario recorrer la colección de controles de cada formulario, ese contenedor ya tendría esos controles...

...bueno, a lo que veníamos...
Cada formulario que lo precise, declara una coleccion, de nombre idéntico (por ejemplo txtBoxes as collection) en cada formulario...
Luego (desde donde se vaya a usar), creas una colección y metes en ella cada formulario que interese (esos que contiene copia de dichos textbox y que deben ser actualizados).
La llamada a la función (seguramente desde un botón) sería mñás o menos así...
Código:
 dim colFrm = nueva coleccion
 with colFrm
        'si form1.txtBoxes.count>0) then
        ' esto no debe ser necesario si en efecto como dices todos tienen textbox del mismo nombre...
            .Add(form1)
        'end if
        .Add(form7)
        .Add(frmCuentas)
        .Add(form12)
        .Add(me) ' siendo el caso que este botón esté en este formulario...
  end with

  call ActualizarEstosForms(colFrm, query, conex, ...)
  ' activar-mostrar el form que prefieras, por ejemplo
  colFrm.Item(0).show ' .BringToFront .Activate, .Visible=True . enable=true etc... según sea el caso estén cargados o no, visibles o no, etc...


Esto es rentable, porque la búsqueda de dichos controles solo debería hacerse una vez cuando se carga el proyecto (y si no hay cambios dinámicos de controles textbox, claro), y no cada vez que se requiera cargar datos desde la BD.
Código:
private sub Main 
    LlenarColTextboxFromformx(form1)
    LlenarColTextboxFromformx(form7)
    LlenarColTextboxFromformx(frmCuentas)
    LlenarColTextboxFromformx(form12)
    LlenarColTextboxFromformx(frmPrincipal)
end sub


declara en diseño en cada formulario una coleccion txtBoxes...
Código:
funcion LlenarColTextboxFromformx( byref f as form)  as short
     por cada ctrl in f.ControlCollection
         si ctrl.getType.name = "TextBox" luego  ' otra forma de preguntar...
             f.txtBoxes.add(ctrl)
         end if
     siguiente

     devolver f.txtBoxes.Count
fin funcion


Luego creas una función que reciba como parámetro esa colección de  formularios...
que se recorre y de los cuales se van tomando sus textbox...
Código:
funcion ActualizarEstosForms( colF as coleccion, ....)    
    dim f as form
    dim tb as textbox
    dim txt as string

    try
        consulta a la BD 

        por cada f en colF
            por cada tb en subf.txtBoxes
                try
                    txt = Getstring(....)
                    tb.Text = txt
                 catch
                     messagebox.show "Nombre del textbox no hallado, corrige el nombre" ' el error más probable, para el caso...
                 end try
            siguiente
        siguiente
    catch ex as exception
        mesagebox.show (ex.message) ' algún problema con la base de datos...
    finally
    end try
fin funcion


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines