none
Actualizar tablas desde otro formulario. RRS feed

  • Pregunta

  • Hola.

    Primero decir que se trata de Windows Form con base de datos en Access y trabajando desde Microsoft Visual Studio 2015.

    No se como hacer para actualizar una tabla que está en el form1 desde otro formulario distinto form2.

    Me explico:
    Tengo una tabla de datos metida en el form1 y para meter datos pulso un botón que me abre un form2, aquí meto los datos y finalizo dándole a un botón que me guarda los datos a la tabla que está en el  form1. Lo que quiero es que al dar a guardar me actualice la tabla del form1 y se vean los datos introducidos.

    Actualmente lo que he hecho es poner un botón en el form1 que me actualiza las tablas y lo que pretendo es que se actualice desde el form2 cuando le doy a guardar.

    - Este comando es el que actualiza las tablas desde el form1 y que no funciona desde el form2:

    Me.TablaDatosSociosTableAdapter.Fill(Me.BDDatosSociosDataSet.TablaDatosSocios)


    A ver si alguien puede guiarme un poco que no doy con la tecla. Gracias

    miércoles, 7 de noviembre de 2018 23:36

Todas las respuestas

  • La primera guía que te doy es que no pienses en términos de formularios sino de instancias de los formularios. No tengas en mente el Form1 y el Form2, piensa que ambos se pueden instanciar muchas veces y que puedes tener abiertas en pantalla muchas instancias del Form1 y del Form2. Aunque tú sepas que solo has abierto una instancia, el compilador no lo sabe. Cuando desde tu instancia de Form2 quieres actualizar una tabla del Form1, en realidad lo que tienes que escribir es una llamada a la tabla de la instancia de Form1.

    Por ejemplo, si originalmente abriste el Form1 así:

    Dim frm as New Form1() : frm.Show()

    entonces tienes que actualizar la tabla en frm, no en Form1.

    Lógicamente eso implica que esa instancia "frm" tiene que conocerla el Form2, si es desde ahí desde donde haces la llamada. Puedes pasársela, por ejemplo, a través de una propiedad, o a través del constructor. Si estás abriendo el form2 desde el propio form1, entonces esa instancia "frm" resulta ser el "Me" del form1. Se lo puedes pasar al form2:

    Dim f2 as New Form2(Me) : f2.Show()

    Obviamente en el Form2 tendrás que modificar el constructor para que reciba y guarde ese dato, por ejemplo, supongamos que lo guarda en una variable llamada f1. Entonces puedes llamar a tu sentencia de actualización así:

    f1.TablaDatosSociosTableAdapter.Fill(f1.BDDatosSociosDataSet.TablaDatosSocios)

    suponiendo que el tableadapter y el dataset se encuentran en el form1, por eso llevan f1 en lugar de Me. Asegúrate de que son "public" en el form1, de lo contrario el código anterior dará un error de compilación.

    Dicho lo anterior, hay que señalar que esto no es "elegante" porque requiere que el form2 "conozca" el form1 y en consecuencia quedan "fuértemente acoplados", lo cual dificulta el mantenimiento y la reutilización de código. Si quieres ser más elegante, puedes declarar un evento en el form2 que devuelva los datos, y que el form1 se suscriba a él y realice la grabación cuando lo reciba.

    jueves, 8 de noviembre de 2018 7:41
  • Gracias Alberto. 

    Ya he leído 4 veces tu respuesta y tendré que leerla otras más.

    A ver si en una de estas acabo entendiéndola, mi nivel no es alto, estoy aprendiendo.

    No entiendo esto "Obviamente en el Form2 tendrás que modificar el constructor para que reciba y guarde ese dato". ¿Que dato?.

    En verdad casi no entiendo nada de lo que has puesto, pero no por ti, si no por mi, que estoy verdecillo en esto. Muchas gracias por tu interés Alberto, seguiré intentándolo.

    viernes, 9 de noviembre de 2018 0:00
  • No entiendo esto "Obviamente en el Form2 tendrás que modificar el constructor para que reciba y guarde ese dato". ¿Que dato?.

    ¿Qué datö? Pues el que le estamos pasando al llamarlo. Es decir, si llamamos así:

    Dim f2 as New Form2(Me)

    ese "Me" es el dato que le estamos pasando al Form2.

    Si solo escribes eso sin cambiar nada en el Form2, dará un error de compilación diciendo que le "sobra" ese dato, porque el Form2 tal como viene "de fábrica" no espera que le pasen nada.

    Entonces en el Form2 hay que cambiar el constructor para poder pasar esa información. Busca el Public Sub New del Form2, si es que existe, o si no añade uno nuevo. Te pongo más o menos cómo debería ser escribiéndolo de memoria, pero puede que se me olvide algo y tengas que modificarlo tal como lo requiera tu form:

    Dim f1 as Form1
    
    Public Sub New(llamante As Form1)
        f1 = llamante
        InitializeComponent()
    End Sub

    Ese "Me" que le pasábamos al Form le llega en el parámetro "llamante", y entonces lo guarda en la variable "f1". Eso es lo que quería decir mi respuesta anterior cuando decía "...modificar el constructor para que reciba y guarde ese dato".

    Después ya puedes usar f1.loquesea para llamar a cualquier dato del Form1 que sea "Public".


    viernes, 9 de noviembre de 2018 6:37
  • Es muy sencillo MarioEBP.

    Ya casi tienes todo el trabajo hecho. Te lo explicaré de la manera más sencilla y práctica que se pueda.

    Entra al evento Click del botón del form1. Esto te dará un código similar a esto:

    Private Sub NombreDeBoton_Click(sender As Object, e As EventArgs) Handles NombreDeBoton.Click
    
    End Sub

    Dentro de este, puedes utilizar el siguiente código.

    '1.- Creas una variable con el nombre que quieras, en este ejemplo se llamará FormAgregarRegistros y del tipo form2 (o el nombre de tu formulario donde agregas los registros)
    Dim FormAgregarRegistros As form2
    
    '2.- Después, le dices que cree un nuevo formulario y lo asigne a la variable que creaste anteriormente.
    FormAgregarRegistros = New form2
    
    '3.- Ahora, vas a mostrar el formulario con el método ShowDialog()
    FormAgregarRegistros.ShowDialog()
    
    '4.- Después de esto... trabajará de manera normal el formulario con el que agregas registros.
    
    '5.- Cuando termines de agregar el registro desde el form2 y le de clic en el botón Guardar. Le dices que cierre el form2 con el código: Me.Close
    'Al hacer esto, tu programa se regresará al form1 para continuar ejecutando las siguiente instrucciones por lo que, después de los códigos anteriores colocas el código que te permite llenar el Datagridview.
    
    Me.TablaDatosSociosTableAdapter.Fill(Me.BDDatosSociosDataSet.TablaDatosSocios)
    
    
    Código completo:
    Dim FormAgregarRegistros As form2
    FormAgregarRegistros = New form2
    FormAgregarRegistros.ShowDialog()
    
    Me.TablaDatosSociosTableAdapter.Fill(Me.BDDatosSociosDataSet.TablaDatosSocios)



    sábado, 22 de diciembre de 2018 20:44