none
Reflejando Cambios En Un DATAGRIDVIEW RRS feed

  • Pregunta

  • Hola a tod@a, A ver como explico el problemilla que tengo. Tengo un form (FORM1) que incluye un Datagridview que muestra datos de una tabla. Dentro de este form1 hay un botón que abre otro form (FORM2) que puede operar sobre la misma tabla y hacer cambios. Necesito que cuando cierre el FORM2 y vuelva al FORM1 los cambios que haya hecho se reflejen automáticamente en el Datagridview… ¿alguna idea?

    Gracias por adelantado

    miércoles, 25 de abril de 2012 9:53

Respuestas

  • hola

    primero ante de todo define un

    Imports System.Data.OleDb

    asi escribes menos codigo

    --------------

    despues prueba ejecutando solo este codigo

    Dim Adaptador As New OleDbDataAdapter("select * from productos", cnMAin)
    Dim Tabla As New DataTable
    Adaptador.Fill(Tabla)
    
    DataGridView1.DataSource = Tabla

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 2 de mayo de 2012 3:02

Todas las respuestas

  • Buenas compilando.

    Si los cambios los realizas directamente en la base de datos, haz una nueva carga de datos al volver del Form2.

    Algo así:

    Dim ObjForm1 As Form1 = New Form1()
    ObjForm1.ShowDialog()
    
    'Recarga de datos
    Me.DataGridView1.DataSource = CargarDatos()

    Así al mostrarlo de manera modal, al salir se recargan los datos.

    Si lo que necesitas es trabajar con un DataSet modificado en el Form2 en el Form1, tendrás que pasar el DataSet por referencia al Form2 con lo que los cambios que tengan se verán reflejados en el Form1.

    Un saludo.


    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es

    miércoles, 25 de abril de 2012 10:48
  • Hola,

    voy a asumir que el boton se llama Button1, por lo que el código te quedaría así

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    	Dim form2 As New Form2()
    	AddHandler form2.FormClosed, AddressOf Me.form_Closed
    	form2.Show()
    End Sub
    
    Private Sub form_Closed(sender As System.Object, e As System.Windows.Forms.FormClosedEventArgs)
    	' El fomulario 2 se ha cerrado. Recargamos los datos
    	MessageBox.Show("El fomulario 2 se ha cerrado. Recargamos los datos")
    End Sub

    Lo que hacemos es engancharnos al evento FormClosed que se dispara cuando el form2 se ha cerrado.


    Atentamente, Sergio.

    Blog
    Twitter

    miércoles, 25 de abril de 2012 10:52
  • Hola:
    En un Form1 con 1 DataGridView, copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient

    Public Class Form1
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"

        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.DataGridView1.DataSource = lF_dtActualizaGrid()
        End Sub

        Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
            If e.RowIndex = -1 Then
                Return
            End If
            Dim loFila As DataGridViewRow = Me.DataGridView1.CurrentRow()
            Dim loForm As New Form2
            loForm.Padre = Me
            loForm.ID = CInt(loFila.Cells("EmployeeID").Value)
            loForm.Nombre = Convert.ToString(loFila.Cells("FirstName").Value)
            loForm.ShowDialog()
        End Sub

        Public Function lF_dtActualizaGrid() As DataTable
            Try
                Dim loDataTable As New DataTable
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Dim loDataAdapter As New SqlDataAdapter("Select EmployeeID, FirstName From Employees", loConexion)
                    loDataAdapter.Fill(loDataTable)
                End Using
                Return loDataTable
            Catch ex As Exception
                MessageBox.Show(ex.Message, "lF_dtActualizaGrid", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return Nothing
            End Try
        End Function

    End Class

    En un Form2 con 2 TextBox (txtID y txtNombre) y 2 Button (btnGuardar y btnSalir), copia y pega el siguiente codigo

    Option Explicit On
    Option Strict On
    Imports System.Data.SqlClient

    Public Class Form2
        Private msCadenaSQL As String = "Data Source=.\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True"
        Private mFrmPadre As Form1
        Private mID As Integer
        Private mNombre As String

        Public Property Padre() As Form1
            Get
                Return mFrmPadre
            End Get
            Set(ByVal value As Form1)
                mFrmPadre = value
            End Set
        End Property

        Public Property ID() As Integer
            Get
                Return mID
            End Get
            Set(ByVal value As Integer)
                mID = value
            End Set
        End Property

        Public Property Nombre() As String
            Get
                Return mNombre
            End Get
            Set(ByVal value As String)
                mNombre = value
            End Set
        End Property

        Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Me.txtID.Text = CStr(mID)
            Me.txtNombre.Text = mNombre
        End Sub

        Private Sub btnGuardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnGuardar.Click
            Try
                Using loConexion As New SqlConnection(msCadenaSQL)
                    Dim lsQuery As String = "Update Employees Set FirstName=@Nombre Where EmployeeID=@ID"
                    ' crear comando
                    Using loComando As New SqlCommand(lsQuery, loConexion)
                        'añadir parametros al comando
                        loComando.Parameters.Add(New SqlParameter("@ID", Me.txtID.Text))
                        loComando.Parameters.Add(New SqlParameter("@Nombre", Me.txtNombre.Text))
                        loConexion.Open()   ' abrir conexión
                        loComando.ExecuteNonQuery()
                    End Using
                End Using
            Catch Exp As SqlException
                MessageBox.Show(Exp.Message, "btnGuardar_Click", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch Exp As Exception
                MessageBox.Show(Exp.Message, "btnGuardar_Clickr", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try

        End Sub

        Private Sub btnSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalir.Click
            mFrmPadre.DataGridView1.DataSource = mFrmPadre.lF_dtActualizaGrid()
            Me.Close()
        End Sub
    End Class

    Espero que te sirva
    Un saludo desde Bilbo
    Carlos

    miércoles, 25 de abril de 2012 11:13
  • hola

    el form2 lo abres de forma modal ? o usando el simple Show() ?

    porque la solucion cambia segun cual sea la forma en que abres ese form

    Private Sub Form1_Load()
    
    	CargarGrilla()
    
    End Sub
    
    Private Sub cmdAgregar_Click(sender As Object, e As EventArgs)
    
    	Dim form2 As New Form2()
    
    	AddHandler form2.FormClosed, AddressOf form2_FormClosed
    
    	form2.Show()
    
    End Sub
    
    Private Sub form2_FormClosed(sender As Object, e As FormClosedEventArgs)
    
    	CargarGrilla()
    
    End Sub

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 25 de abril de 2012 14:01
  • Gracias por las respuestas. El Form 2 se carga desde el código del form 1 con un simple SHOW.

    Entonces ¿cómo pongo el evento form2Closed en el form 1 para recargar el Datagridview?...

    la clave es el evento cerrar form2 mirado desde form1
    • Editado compilando domingo, 29 de abril de 2012 6:43
    domingo, 29 de abril de 2012 6:33
  • Hola

    Leandro Tuttini y sergiomf te ha dado la respuesta

    Private Sub cmdAgregar_Click(sender As Object, e As EventArgs)
        
    Dim form2 As New Form2()
         
    AddHandler form2.FormClosed, AddressOf form2_FormClosed
         form2
    .Show()
    End Sub

    El form1 detecta el cierre del form2 y vuelve a cargar la grilla

    ' Este evento va en el form1
    Private Sub form2_FormClosed(sender As Object, e As FormClosedEventArgs)
        CargarGrilla
    ()
    End Sub



    • Editado ToniAG domingo, 29 de abril de 2012 9:54
    domingo, 29 de abril de 2012 8:44
  • Gracias por las respuestas. El Form 2 se carga desde el código del form 1 con un simple SHOW.

    Entonces ¿cómo pongo el evento form2Closed en el form 1 para recargar el Datagridview?...

    la clave es el evento cerrar form2 mirado desde form1
    Si estás usando el método Show, puedes usar tanto el código que te pasó Leandro como el que te pasé yo (básicamente son iguales)...

    Atentamente, Sergio.

    Blog
    Twitter

    domingo, 29 de abril de 2012 9:47
  • GRacias a todos... ya está solucionado el tema del evento cerrar form2. Ahora he intentado recargar el DataGridVIew así:

    MisDatosBindingSource.ResetBindings(True)

    DataGridView1.Refresh()

    El DataGridview tiene su origen de datos en un bindingSource, he probado a recargarlo con las sentencias anteriores y NO va.. ¿qué hago mal?

    GRacias

    domingo, 29 de abril de 2012 17:26
  • es que deberias volver a realizar la query a la db ejecutando el SELECT original y asignarlo al Datasource de BindingSource

    para que actualice, el refresh sin que realices una nueva consulta a la db no efecta a los datos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    domingo, 29 de abril de 2012 21:47
  • He intentado hacerlo del siguiente modo y no va bien.

    - Si añado un registro a la tabla en el form2, al volver al form1 este registro si se ve en el datagridview que hay en el form1

    - Si elimino un registro de la tabla en el form2, al volver al form1 el registro sigue apareciendo en el datagridview que hay en el form1 (flipo!!!)

    aquí va el código que se ejecuta en el form1 una vez cerrado el form2:

    Dim Adaptador As New System.Data.OleDb.OleDbDataAdapter
            Dim Tabla As DataTable = mibasedeDatosDataSet.Tables("productos")
            Dim Actualizador As New OleDb.OleDbCommandBuilder(Adaptador)
            Adaptador = New OleDb.OleDbDataAdapter("select * from productos", cnMAin)
            Adaptador.Fill(Tabla)
            Actualizador = New OleDb.OleDbCommandBuilder(Adaptador)
            productosBindingSource.DataSource = Tabla
            DataGridView1.DataSource = Nothing
            DataGridView1.Refresh()
            DataGridView1.DataSource = productosBindingSource

    recordad que en el form1 el datagridview1 se carga a partir de un bindingsource: productosBindingSource

    yo pensaba que con este código volvía a releer la tabla de la base de datos...

    gracias por la ayuda

    martes, 1 de mayo de 2012 17:14
  • hola

    primero ante de todo define un

    Imports System.Data.OleDb

    asi escribes menos codigo

    --------------

    despues prueba ejecutando solo este codigo

    Dim Adaptador As New OleDbDataAdapter("select * from productos", cnMAin)
    Dim Tabla As New DataTable
    Adaptador.Fill(Tabla)
    
    DataGridView1.DataSource = Tabla

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 2 de mayo de 2012 3:02
  • Todo arreglado, muchas gracias a todos.
    sábado, 12 de mayo de 2012 16:44