none
Mostrar datos de un formulario modal a un formulario hijo de un mdi parent

    Pregunta

  • Hola, buen día

    Tengo un 3 formularios:

    • Formulario MDI Parent
    • Formulario Hijo que se muestra dentro del formulario MDI Parent 
    • Formulario Modal que lo llamo desde el formulario hijo del MDI Parent(Aquí hay data grid)

    Lo que busco es llamar desde el formulario hijo al formulario modal y que al ejecutar el evento doubleclick en el control datagrid asigne algunos datos de la fila seleccionada a los controles del formulario hijo.

    Cuando tengo como formulario de inicio a formulario hijo y no al mdi parent el siguiente código me funciona, pero si es al contrario los control que asigno desde el formulario modal se quedan vacios.

    Formulario MDI Parent

    Private Sub HijoToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HijoToolStripMenuItem.Click
    
            Dim frm As New frmHijo
            frm.MdiParent = Me
            frm.Show()
        End Sub

    Formulario Hijo

    Private Sub btnBuscar_Click(sender As Object, e As EventArgs) Handles btnBuscar.Click
            Dim frm As New frmModal
            frm.modo = "buscar"
            frm.ShowDialog()
        End Sub

    Formulario Modal

    Private Sub dgvArticulo_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvArticulo.CellDoubleClick
            If modo = "buscar" Then
                Dim fila As Integer = dgvArticulo.CurrentRow.Index
                frmHijo.txtIdArticulo.Text = dgvArticulo.Rows(fila).Cells(0).Value.ToString()
                frmHijo.txtCodArticulo.Text = dgvArticulo.Rows(fila).Cells(1).Value.ToString()
                frmHijo.txtArticulo.Text = dgvArticulo.Rows(fila).Cells(2).Value.ToString()
                frmHijo.txtVersion.Text = dgvArticulo.Rows(fila).Cells(3).Value.ToString()
                frmHijo.txtPrecio.Text = dgvArticulo.Rows(fila).Cells(4).Value.ToString()
                Close()
            End If
        End Sub

    Saludos!

    domingo, 27 de noviembre de 2016 17:00

Respuestas

  • CSLévano,

    Una forma de resolver estos casos es declarando una propiedad en la clase frmModal de tipo DataGridViewRow, el formulario llamador -una vez el formulario modal se haya cerrado- puede obtener los datos seleccionados:

    - frmModal

    Public Class frmModal
    
        Public Property RowSelected As DataGridViewRow
    
        Private Sub frmModal_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
        End Sub
    
        Private Sub dataGridView1_CellDoubleClick(sender As Object, ...
    
            Dim row As DataGridViewRow = dataGridView1.Rows(e.RowIndex)
    
            If row IsNot Nothing Then
                RowSelected = row
    
                DialogResult = DialogResult.OK
            End If
    
        End Sub
    End Class

    - frmHijo

    Private Sub btnLlamarFormModal_Click(sender As Object, ...
    
    	Using form As New frmModal()
    		If form.ShowDialog() = DialogResult.OK Then			
    			txtIdArticulo.Text = form.RowSelected.Cells(0).Value.ToString
    			txtCodArticulo.Text = form.RowSelected.Cells(1).Value.ToString
    			'Otras asignaciones
    		End If
    	End Using
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 27 de noviembre de 2016 18:11
  • Una consulta más, para que se hace uso de la instrucción Using, podrías explicármelo por favor?

    En general es buena practica usar la instrucción using para enmarcar el ámbito de cualquier objeto siempre y cuando la clase exponga la interface IDisposable. En el caso particular de los formularios modales, el cerrar la ventana produce que el formulario sólo se oculte (DialogResult.Cancel), por tanto, una vez que el formulario (modal) termina con su tarea es recomendable llamar al método Dispose -o enmarcarlo mediante la instrucción using-.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 28 de noviembre de 2016 4:39

Todas las respuestas

  • CSLévano,

    Una forma de resolver estos casos es declarando una propiedad en la clase frmModal de tipo DataGridViewRow, el formulario llamador -una vez el formulario modal se haya cerrado- puede obtener los datos seleccionados:

    - frmModal

    Public Class frmModal
    
        Public Property RowSelected As DataGridViewRow
    
        Private Sub frmModal_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
    
        End Sub
    
        Private Sub dataGridView1_CellDoubleClick(sender As Object, ...
    
            Dim row As DataGridViewRow = dataGridView1.Rows(e.RowIndex)
    
            If row IsNot Nothing Then
                RowSelected = row
    
                DialogResult = DialogResult.OK
            End If
    
        End Sub
    End Class

    - frmHijo

    Private Sub btnLlamarFormModal_Click(sender As Object, ...
    
    	Using form As New frmModal()
    		If form.ShowDialog() = DialogResult.OK Then			
    			txtIdArticulo.Text = form.RowSelected.Cells(0).Value.ToString
    			txtCodArticulo.Text = form.RowSelected.Cells(1).Value.ToString
    			'Otras asignaciones
    		End If
    	End Using
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 27 de noviembre de 2016 18:11
  • Sí, gracias ya pude resolverlo utilizando como lo mencionaste, utilizando DialogResult.

    Saludos!

    lunes, 28 de noviembre de 2016 3:16
  • Una consulta más, para que se hace uso de la instrucción Using, podrías explicármelo por favor?

    lunes, 28 de noviembre de 2016 3:42
  • Una consulta más, para que se hace uso de la instrucción Using, podrías explicármelo por favor?

    En general es buena practica usar la instrucción using para enmarcar el ámbito de cualquier objeto siempre y cuando la clase exponga la interface IDisposable. En el caso particular de los formularios modales, el cerrar la ventana produce que el formulario sólo se oculte (DialogResult.Cancel), por tanto, una vez que el formulario (modal) termina con su tarea es recomendable llamar al método Dispose -o enmarcarlo mediante la instrucción using-.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 28 de noviembre de 2016 4:39
  • Ok, muchas gracias!
    lunes, 28 de noviembre de 2016 15:45
  • Willimas Morales podrías facilitarme tu correo electrónico para que pueda hacer algunas consultas? por favor!
    jueves, 15 de diciembre de 2016 3:34