none
Llamar a un formulario desde varios eventos en otro formulario

    Pregunta

  • Hola.

    Estoy usando Visual Studio 2015 Express para Escritorio

    Como puedo solucionar lo siguiente?

    Dim frms As New Form2
    
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    frms.show
    End Sub
    
    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    frms.show
    End Sub
    

    Se que de esta otra manera se consigue, pero no me sirve

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    Dim frms As New Form2
    frms.show
    End Sub
    
    Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    Dim frms As New Form2
    frms.show
    End Sub
    

    Gracias.


    Rafael FM

    sábado, 31 de diciembre de 2016 12:51

Respuestas

  • "RafaelFM" preguntó:

    > Como puedo solucionar lo siguiente?
    >
    > Dim frms As New Form2
    >
    > Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    >     frms.show
    > End Sub
    >

    Hola, Rafael:

    Como estás creando la instancia de Form2 a la misma vez que declaras el objeto frms, no te va a quedar más remedio que consultar si la instancia de ese formulario ha sido desechada. Para ello, solamente tienes que llamar a la propiedad IsDisposed del formulario:

        Dim frms As New Form2()
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            If (Not frms.IsDisposed) Then
                frms.Show()
            Else
                frms = New Form2()
                frms.Show()
            End If
    
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            If (Not frms.IsDisposed) Then
                frms.Show()
            Else
                frms = New Form2()
                frms.Show()
            End If
    
        End Sub

    > Se que de esta otra manera se consigue, pero no me sirve
    >
    > Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    >     Dim frms As New Form2
    >     frms.show
    > End Sub

    Lo mejor que puedes hacer es lo siguiente:

        Private frms As Form2 = Nothing ' Declarar la variable objeto sin inicializarla
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            If ((frms Is Nothing) OrElse (frms.IsDisposed)) Then
                ' Si el valor del objeto es Nothing o está desechado,
    ' crear una nueva instancia de la clase. frms = New Form2() frms.Show() End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If ((frms Is Nothing) AndAlso (frms.IsDisposed)) Then
               ' Si el valor del objeto es Nothing o está desechado,
                ' crear una nueva instancia de la clase. frms = New Form2() frms.Show() End If End Sub

    Lo mismo te resulta de utilidad el contenido del artículo siguiente:

    Abrir y cerrar formularios con Visual Basic .NET

    Un saludo y ¡Feliz Año Nuevo!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    lunes, 2 de enero de 2017 15:42
    Moderador
  • Hola RafaelFM,

    En el primer caso creas una nueva instancia pública de tu formulario Form2 dónde si ejecuta el evento Click del botón 1 mostraría el formulario, pero si este es cerrado, al ejecutar el evento click del botón 2, ese objeto ya estaría deshechado (IDisposable).

    Un truco sería cancelar la acción cerrar usando el evento FormClosing de tu Form2.

    Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        e.Cancel = True  'Cancela el cierre
        Me.Hide()  'Esconde el formulario
    End Sub

    Por lo que en tu form solo bastaría :

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click
        frms.Show()
    End Sub

    Enlazando ambos eventos Click a uno solo.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    sábado, 31 de diciembre de 2016 18:12

Todas las respuestas

  • Hola RafaelFM,

    En el primer caso creas una nueva instancia pública de tu formulario Form2 dónde si ejecuta el evento Click del botón 1 mostraría el formulario, pero si este es cerrado, al ejecutar el evento click del botón 2, ese objeto ya estaría deshechado (IDisposable).

    Un truco sería cancelar la acción cerrar usando el evento FormClosing de tu Form2.

    Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        e.Cancel = True  'Cancela el cierre
        Me.Hide()  'Esconde el formulario
    End Sub

    Por lo que en tu form solo bastaría :

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click
        frms.Show()
    End Sub

    Enlazando ambos eventos Click a uno solo.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    sábado, 31 de diciembre de 2016 18:12
  • Gracias por responder Joel C. Naupa Crispín


    Rafael FM

    lunes, 2 de enero de 2017 14:46
  • "RafaelFM" preguntó:

    > Como puedo solucionar lo siguiente?
    >
    > Dim frms As New Form2
    >
    > Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    >     frms.show
    > End Sub
    >

    Hola, Rafael:

    Como estás creando la instancia de Form2 a la misma vez que declaras el objeto frms, no te va a quedar más remedio que consultar si la instancia de ese formulario ha sido desechada. Para ello, solamente tienes que llamar a la propiedad IsDisposed del formulario:

        Dim frms As New Form2()
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            If (Not frms.IsDisposed) Then
                frms.Show()
            Else
                frms = New Form2()
                frms.Show()
            End If
    
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    
            If (Not frms.IsDisposed) Then
                frms.Show()
            Else
                frms = New Form2()
                frms.Show()
            End If
    
        End Sub

    > Se que de esta otra manera se consigue, pero no me sirve
    >
    > Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    >     Dim frms As New Form2
    >     frms.show
    > End Sub

    Lo mejor que puedes hacer es lo siguiente:

        Private frms As Form2 = Nothing ' Declarar la variable objeto sin inicializarla
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            If ((frms Is Nothing) OrElse (frms.IsDisposed)) Then
                ' Si el valor del objeto es Nothing o está desechado,
    ' crear una nueva instancia de la clase. frms = New Form2() frms.Show() End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click If ((frms Is Nothing) AndAlso (frms.IsDisposed)) Then
               ' Si el valor del objeto es Nothing o está desechado,
                ' crear una nueva instancia de la clase. frms = New Form2() frms.Show() End If End Sub

    Lo mismo te resulta de utilidad el contenido del artículo siguiente:

    Abrir y cerrar formularios con Visual Basic .NET

    Un saludo y ¡Feliz Año Nuevo!


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    lunes, 2 de enero de 2017 15:42
    Moderador