none
MDI con 2 Formularios Hijos RRS feed

  • Pregunta

  • Hola a todos tengo el siguiente problema: estoy trabajando una aplicacion en VB.NET con visual studio 2010 y todo se ha basado en los ejemplos en Capas de Leandro Tuttini, bueno en el primero formulario que funciona como MDI tiene un menu_strip y en el tengo el siguiente codigo:

    dim frm as new form2
    frm.MdiParent = me
    frm.show()

    Aqui todo OK

    En el segundo form tengo 2 textbox y un boton en el que tengo el siguiente codigo:

    Dim frm As New Frm3
            If frm.ShowDialog() = Windows.Forms.DialogResult.OK Then
    
                'mantengo la entidad seleccionada global al formualario
    
                Entidad = EntidadBOL.GetByentidadDeAccessoId(frm.Cod)
    
    
                'muestro en la pantalla la info del estado  buscado 
                '
                Txtcod.Text = Convert.ToInt32(entidad.cod)
                TxtNombre.Text = entidad.nombre

    Aqui el primer problema y es que el formulario invocado no se dentro del formulario MDI (investigado se que al utilizar DialogShow esto no funciona.Me gustaria resolverlo para que todo este dentro de mi MDI.

    Este tercer Fomulario tiene 1 textbox, 1 datagridview y 1 boton, bueno en el datagridview tengo el siguiente codigo:

    '
            '
            'evita la seleccion del header de la grilla
            'se se hace dobel click en el encabezado el valor de rowindex sera de -1
            '
            If e.RowIndex = -1 Then
                Return
            End If
    
            _Cod = Convert.ToInt32(dgvEstadoCivil.Rows(e.RowIndex).Cells("cod").Value)
            Me.DialogResult = Windows.Forms.DialogResult.OK
    
            Frm2.TxtNombre.Enabled = True
            Frm2.BtnActualizar.Enabled = True
            Frm2.BtnBuscar.Enabled = False
            Frm2.TxtNombre.Focus()
            Me.Close()

    Aqui este el problema tengo la información que quiero modificar pero no puedo ya que el textbox nombre aparece deshabilitado y no puedo actualizarlo, pero si no utilizo el MDI si me funciona.

    Alguien que me pueda dar una luz que esta mal.

    Gracias



    • Editado DJINVACION miércoles, 28 de noviembre de 2012 7:08
    miércoles, 28 de noviembre de 2012 7:06

Respuestas

  • Hola

    > Aqui el primer problema y es que el formulario invocado no se dentro del formulario MDI

    ¿que quieres decir? que este dentro o que no este dentro, si quieres que este dentro tienes que hacer como as hecho con el primero formulario.MdiParent = me (me sera el formulario MDI)

    frm.ShowDialog()  lo que hace es abrir el formulario como modal, o sea que no podras tener acceso a los otros formularios hasta que no cierres este, pero un formulario modal no puede estar dentro de un MDI

    El segundo tema es porque estas utilizando diferentes instancias del mismo formulario, cuando haces esto

    dim frm as new form2
    frm
    .MdiParent = me
    frm
    .show()

    estas creando una instancia del form2, no tendras acceso a sus controles si no utilizas la misma instancia frm

    Lo que puedes hacer es declarar la instancia del form2 a nivel de formulario o clase (fuera de los sub o Function)

    Private frm as Form2

    o

    WithEvents frm as Form2  (De esta forma puedes controlar los eventos de form2 en el MDI)

    tambien podrias pasar el frm al tercer formulario a traves del constructor, creo que seria la mejor opción, pero para ello tendras que añadir mas codigo.

    Para poder pasar el form2 as form3 (Modal) crea un constructor

        Private frm As form2
    
        Public Sub New(Formulario As Form2)
            InitializeComponent()
    
            frm = Formulario
    
        End Sub

    Y para modificar los controles del form2 utilizamos la variable frm

            Frm.TxtNombre.Enabled = True
            Frm.BtnActualizar.Enabled = True
            Frm.BtnBuscar.Enabled = False
            Frm.TxtNombre.Focus()

    Aqui te esta obligando que para poder crear el form3 tienes que pasarle el form2 y se haria de esta forma

    private frm as new Form2 ' a nivel de formulario

    private sub Load(...) handles ...
    frm.MdiParent = Me
    frm.Show
    End sub

    ...

    Dim frm3 As New Form3(frm) frm3.ShowDialog()

    No se si me explico, pero lo importante es que si creas una instancia Dim f as new form2 para acceder al form2 tienes que utilizar la instancia f

    Saludos


    • Editado AGTROI miércoles, 28 de noviembre de 2012 11:58
    • Marcado como respuesta DJINVACION miércoles, 28 de noviembre de 2012 16:59
    miércoles, 28 de noviembre de 2012 11:20

Todas las respuestas

  • Hola

    > Aqui el primer problema y es que el formulario invocado no se dentro del formulario MDI

    ¿que quieres decir? que este dentro o que no este dentro, si quieres que este dentro tienes que hacer como as hecho con el primero formulario.MdiParent = me (me sera el formulario MDI)

    frm.ShowDialog()  lo que hace es abrir el formulario como modal, o sea que no podras tener acceso a los otros formularios hasta que no cierres este, pero un formulario modal no puede estar dentro de un MDI

    El segundo tema es porque estas utilizando diferentes instancias del mismo formulario, cuando haces esto

    dim frm as new form2
    frm
    .MdiParent = me
    frm
    .show()

    estas creando una instancia del form2, no tendras acceso a sus controles si no utilizas la misma instancia frm

    Lo que puedes hacer es declarar la instancia del form2 a nivel de formulario o clase (fuera de los sub o Function)

    Private frm as Form2

    o

    WithEvents frm as Form2  (De esta forma puedes controlar los eventos de form2 en el MDI)

    tambien podrias pasar el frm al tercer formulario a traves del constructor, creo que seria la mejor opción, pero para ello tendras que añadir mas codigo.

    Para poder pasar el form2 as form3 (Modal) crea un constructor

        Private frm As form2
    
        Public Sub New(Formulario As Form2)
            InitializeComponent()
    
            frm = Formulario
    
        End Sub

    Y para modificar los controles del form2 utilizamos la variable frm

            Frm.TxtNombre.Enabled = True
            Frm.BtnActualizar.Enabled = True
            Frm.BtnBuscar.Enabled = False
            Frm.TxtNombre.Focus()

    Aqui te esta obligando que para poder crear el form3 tienes que pasarle el form2 y se haria de esta forma

    private frm as new Form2 ' a nivel de formulario

    private sub Load(...) handles ...
    frm.MdiParent = Me
    frm.Show
    End sub

    ...

    Dim frm3 As New Form3(frm) frm3.ShowDialog()

    No se si me explico, pero lo importante es que si creas una instancia Dim f as new form2 para acceder al form2 tienes que utilizar la instancia f

    Saludos


    • Editado AGTROI miércoles, 28 de noviembre de 2012 11:58
    • Marcado como respuesta DJINVACION miércoles, 28 de noviembre de 2012 16:59
    miércoles, 28 de noviembre de 2012 11:20
  • Me gustaria resolverlo para que todo este dentro de mi MDI.

    podrias usar

    Dim frm As New Frm3

    frm.MdiParent = Me.MdiParent

    frm.Show()

    con eso harias que el form3 este dentro del mdi

    el ShowDialog() no funcioan en un entorno mdi

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 28 de noviembre de 2012 12:06
  • ok AGTROI lo probare, Leandro Tutini lo que pasa es que el showdialog() esta segun tu ejemplo y no se cual sera otra forma de hacerlo la verdad.

    gracias

    miércoles, 28 de noviembre de 2012 15:51
  • AGTROI:

    He creado en el primer Formulario MDI lo que me planteaste asi:

    'codigo a nivel del formulario 1MDI
    private frm as frm2 'este es el de los textbox
    
    public sub new(formulario as frm2)
    initializeComponent()
    frm = formulario
    end sub
    'aqui todo bien
    
    'luego en el menustrip esto
    frm.mdiparent = me
    frm.show()
    
    'aqui todo bien
    
    

    Ahora en el Formulario2 esto:

    'a nivel del formulario2
    private frm as new frm2'aqui no entiendo porque el mismo
                           'y no el formulario que quiero
                           'abrir osea el form3   
    
    'y en el boton buscar esto
    dim frm as new frm3(frm) 'aqui me da error me dice que 
                             'hay demasiados argumentos para
                             'public sub new()
    
    si me puedes orientar gracias

    • Editado DJINVACION miércoles, 28 de noviembre de 2012 16:06 correcion
    miércoles, 28 de noviembre de 2012 16:03
  • Hola

    No, perdona el contructor tienes que hacerlo en el form3

    miércoles, 28 de noviembre de 2012 16:09
  • en el Form3

    private frm as frm2 'este es el de los textbox
    
    public sub new(formulario as frm2)
        initializeComponent()
        frm = formulario
    end sub

    Si llamas al form3 desde la ventana form2 puedes hacer esto

    dim frm as new frm3(me)


    Si form3 la llamas desde el MDI, tendras que pasarle al form3 la instancia del form2 (frm) declarado en el MDI

    dim frm as new frm3(frm)  ' frm declarado a nivel de formulario

    frm.ShowDialog()




    • Editado AGTROI miércoles, 28 de noviembre de 2012 16:30
    miércoles, 28 de noviembre de 2012 16:14
  • gracias funciono colocarlo en el form3

    miércoles, 28 de noviembre de 2012 16:59