Principales respuestas
Form en control panel VB

Pregunta
-
Hola a todos,
he hecho un formulario (form1) padre como esta
Con dos botones un panel al costado...
Quisiera que me ayuden en como podría hacer para que solo pueda abrirse solamente una sola vez, ya que al presionar en el boton "hijo1" me genera varios, como esto:
Ahora si presiono en boton "hijo1" solamente quiero que se maximize el que existe, no quiero que se duplique...
Quisiera una sugerencia de como podrpía hacerlo ya el código para el anterior es lo siguiente:
Public Class Form1
Private Sub btn_hijo1_Click(sender As Object, e As EventArgs) Handles btn_hijo1.Click
If (Me.panelContenedor.Controls.Count > 0) Then
'Me.panelContenedor.Controls.RemoveAt(0) para que que borre y genere nuevamente
End If
Dim hijo1 As New hijo1
hijo1.TopLevel = False
hijo1.Dock = DockStyle.Fill
Me.panelContenedor.Controls.Add(hijo1)
Me.panelContenedor.Tag = hijo1
hijo1.Show()
End Sub
End Class
Ruben(benuvni)
sábado, 4 de noviembre de 2017 15:59
Respuestas
-
Eso es porque lo has cerrado con Close() en lugar de con Hide(). Si lo cierras con Close(), se produce un Dispose() y entonces ya no se le puede volver a hacer el Show() sin antes crear una instancia nueva.
Si no tienes más remedio que cerrarlo con Close, entonces la solución es interceptar el evento Closed y dentro del manejador poner Nothing en la variable InstanciaDeHijo1. Eso hará que el siguiente click del botón cree una instancia nueva en lugar de abrir la antigua.
AddHandler InstanciaDeHijo1.FormClosed AddressOf(SeCerro1) .... Private Sub SeCerro1(sender As Object, e As FormClosedEventArgs) InstanciaDeHijo1 = Nothing End Sub
- Propuesto como respuesta Juan MondragónModerator lunes, 6 de noviembre de 2017 23:39
- Marcado como respuesta Enrique M. MontejoModerator martes, 7 de noviembre de 2017 16:21
domingo, 5 de noviembre de 2017 9:02 -
Guarda una variable que referencia el hijo1. Si está vacía, es que se trata de la primera vez y hay que inicializar el hijo. Sino, en lugar de construir un nuevo hijo maximizas el existente:
Public Class Form1 Private InstanciaDeHijo1 AS Hijo1 = Nothing Private Sub btn_hijo1_Click(sender As Object, e As EventArgs) Handles btn_hijo1.Click If InstanciaDeHijo1 is Nothing Then InstanciaDeHijo1 = New hijo1() InstanciaDeHijo11.TopLevel = False InstanciaDeHijo1.Dock = DockStyle.Fill Me.panelContenedor.Controls.Add(InstanciaDeHijo1) InstanciaDeHijo1.Show() Else InstanciaDeHijo1.WindowState = WindowState.Maximized 'Aquí lo que corresponda para mostrar el form en el estado que quieras InstanciaDeHijo1.Show() End If End Sub End Class
- Marcado como respuesta Enrique M. MontejoModerator martes, 7 de noviembre de 2017 16:21
sábado, 4 de noviembre de 2017 17:32
Todas las respuestas
-
Guarda una variable que referencia el hijo1. Si está vacía, es que se trata de la primera vez y hay que inicializar el hijo. Sino, en lugar de construir un nuevo hijo maximizas el existente:
Public Class Form1 Private InstanciaDeHijo1 AS Hijo1 = Nothing Private Sub btn_hijo1_Click(sender As Object, e As EventArgs) Handles btn_hijo1.Click If InstanciaDeHijo1 is Nothing Then InstanciaDeHijo1 = New hijo1() InstanciaDeHijo11.TopLevel = False InstanciaDeHijo1.Dock = DockStyle.Fill Me.panelContenedor.Controls.Add(InstanciaDeHijo1) InstanciaDeHijo1.Show() Else InstanciaDeHijo1.WindowState = WindowState.Maximized 'Aquí lo que corresponda para mostrar el form en el estado que quieras InstanciaDeHijo1.Show() End If End Sub End Class
- Marcado como respuesta Enrique M. MontejoModerator martes, 7 de noviembre de 2017 16:21
sábado, 4 de noviembre de 2017 17:32 -
Esta muy bien la repuesta pero, hay un detalle:
Cuando lo cierras definitivamente el formulario "hijo1" y nuevamente presionas en el boton "hijo1"
muestra un error:
Ruben(benuvni)
sábado, 4 de noviembre de 2017 23:34 -
Eso es porque lo has cerrado con Close() en lugar de con Hide(). Si lo cierras con Close(), se produce un Dispose() y entonces ya no se le puede volver a hacer el Show() sin antes crear una instancia nueva.
Si no tienes más remedio que cerrarlo con Close, entonces la solución es interceptar el evento Closed y dentro del manejador poner Nothing en la variable InstanciaDeHijo1. Eso hará que el siguiente click del botón cree una instancia nueva en lugar de abrir la antigua.
AddHandler InstanciaDeHijo1.FormClosed AddressOf(SeCerro1) .... Private Sub SeCerro1(sender As Object, e As FormClosedEventArgs) InstanciaDeHijo1 = Nothing End Sub
- Propuesto como respuesta Juan MondragónModerator lunes, 6 de noviembre de 2017 23:39
- Marcado como respuesta Enrique M. MontejoModerator martes, 7 de noviembre de 2017 16:21
domingo, 5 de noviembre de 2017 9:02 -
Muchisimas gracias por la explicacion alberto. Eres un mestro!
Saludos!
Ruben(benuvni)
domingo, 5 de noviembre de 2017 13:28 -
Hola,
Te paso un trozo de código que yo uso:
For Each f2 As Form In Application.OpenForms If f.Name = f2.Name Then Abierto = True Exit For End If Next
Esto está en una función que se le pasa f tipo Form por referencia y devuelve un Booleano.
Además en tu código añadiría después del Show un BringToFront()
Espero que te sirva.
Un saludo.
Miguel
- Editado Miguel Puime domingo, 5 de noviembre de 2017 18:00
- Propuesto como respuesta Juan MondragónModerator miércoles, 8 de noviembre de 2017 18:54
domingo, 5 de noviembre de 2017 17:58 -
Este error te da porque cuando haces el .Show() InstanciaDeHijo1 es Nothing
Un saludo.
Miguel
domingo, 5 de noviembre de 2017 18:51