Foros del Web » Programación para mayores de 30 ;) » .NET »

Evitar que desde un botón se abra varias veces el mismo form

Estas en el tema de Evitar que desde un botón se abra varias veces el mismo form en el foro de .NET en Foros del Web. Hola, les cuento un problema. Tengo una barra de herramientas n la q cada botón da paso a un formulario que cambia dinámicamente según el ...
  #1 (permalink)  
Antiguo 28/09/2005, 05:11
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Evitar que desde un botón se abra varias veces el mismo form

Hola, les cuento un problema.
Tengo una barra de herramientas n la q cada botón da paso a un formulario que cambia dinámicamente según el botón q lo llame pero es el mismo formulario. Desde cada botón mando llamar a este formulario
con .show para q a la vez se puedan abrir formularios desd cada botón y no haga falta cerrar uno para poder abrir otro desde otro botón.
El problema es q desde cada botón puedo abrir varias veces el mismo formulario y tendría q evitar esto pq no tiene mucho sentido. No sé como hacerlo, gracias.
  #2 (permalink)  
Antiguo 28/09/2005, 07:08
Avatar de jhonwilliams  
Fecha de Ingreso: marzo-2004
Ubicación: Copacabana - Colombia
Mensajes: 1.484
Antigüedad: 20 años, 1 mes
Puntos: 76
Mira este link
http://www.forosdelweb.com/f29/como-validar-que-no-puedan-crear-dos-instancias-mismo-objeto-333245/
__________________
Si mi respuesta te ha ayudado, agradezco que me regales unos puntos de Karma XD.

"Una mujer sería encantadora si uno pudiera caer en sus brazos sin caer en sus manos." (Ambrose Bierce)
  #3 (permalink)  
Antiguo 28/09/2005, 12:00
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Hola, lo q pasa q según habla el Patron Singleton es para formularios MDI.
Yo la estructura q tengo más o menos es la d MDI pero no tengo puesta la propiedad isMDIContainer a True ni tengo establecida la propiedad MdiParent para los formularios secundarios. Necesito hacer la aplicación MDI para aplicar eso?

Gracias.
  #4 (permalink)  
Antiguo 28/09/2005, 12:56
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
No es necesario, aquí tienes otra alternativa para tener formularios únicos:
Código:
public static SortedList formInstances = new SortedList(); // Para guardar las referencias de las instancias de los formularios
public static Form AbrirVentana(Type type)
{
	return AbrirVentana(type, false);
}
public static Form AbrirVentana(Type type, bool dialog)
{
	Form formulario;
	if ( (formulario = (Form) formInstances[type.ToString()]) == null || formulario.IsDisposed) 
	{
		formulario = ( Form ) Activator.CreateInstance( type );
		formInstances[type.ToString()] = formulario;
	}
	
	formulario.Activate();
	formulario.WindowState = FormWindowState.Normal;
	if (dialog) 		
		formulario.ShowDialog();
	else
		formulario.Show();

	return formulario;
}
Lo usas de la siguiente manera:

Form1 un_formulario = (Form1)AbrirVentana(typeof(Form1));

Saludos
PS. Personalmente no utilizaría el patrón Singleton para estos casos.
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #5 (permalink)  
Antiguo 28/09/2005, 14:07
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Me da error en l primer if de la funcion AbrirVentana q dice
q el operador = igual no está definido para system.windows.forms.form y q
utilice "is" pero no m funciona. Estoy utilizando vb.net

If (formulario = CType(formInstances(type.ToString), Form)) Is Nothing OrElse formulario.IsDisposed Then
formulario = CType(Activator.CreateInstance(type), Form)
formInstances(type.ToString) = formulario
End If

Gracias.
  #6 (permalink)  
Antiguo 28/09/2005, 16:34
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Por eso es importante que en tu pregunta incluyas el lenguaje con el que trabajas, aquí tienes la función de vb.net
Código:
Public Sub b_Click(ByVal sender as Object, e as EventArgs)
	Dim frm as Form1 = AbrirVentana(GetType(Form1)) ' No compila con "Option Strict", usar el de abajo
	' Dim frm as Form1 = CType(AbrirVentana(GetType(Form1)), Form1)
End Sub
Private shared formInstances As New SortedList() ' Para guardar las referencias de las instancias de los formularios
Public Shared Function AbrirVentana(ByVal type as Type, Optional dialog As Boolean = False) As Form
	Dim Formulario as Form = formInstances(type.ToString()) ' No compila con "Option Strict", usar el de abajo
	' Dim Formulario as Form = CType(formInstances(type.ToString()), Form)
	If formulario Is Nothing OrElse formulario.IsDisposed Then
		formulario = Activator.CreateInstance(type) ' No compila con "Option Strict", usar el de abajo
		' formulario = Ctype(Activator.CreateInstance(type), Form)
		formInstances(type.ToString()) = formulario
	End If
	
	formulario.Activate()
	formulario.WindowState = FormWindowState.Normal
	If dialog Then
		formulario.ShowDialog()
	Else
		formulario.Show()
	End If
		
	Return formulario
End Function
Saludos
PS. El error te manda porque el "=" lo está interpretando como comparación y no como asignación.
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #7 (permalink)  
Antiguo 29/09/2005, 02:17
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Hola, lo q pasa q ahora no sé como utilizarlo pq no m funciona.
Yo inicialmente tenía en cada botón de la barra de herramientas:

case 1

Dim frmSeleccion As New Form4
frmSeleccion.sql = "select idejercicio,nombre,finalidad from Ejercicios"
frmSeleccion.tabla="Ejercicios"
frmSeleccion.Show

Si esto lo sustituyo por:

case 1

dim frmSeleccion as new Form4
frmSeleccion.sql = "select idejercicio,nombre,finalidad from Ejercicios"
frmSeleccion.tabla = "Ejercicios"
frmSeleccion = CType(AbrirVentana(GetType(Form4)), Form4)


Estoy probando cosas pero luego m da error en el formulario frmSeleccion a la hora de llenar el dataset pq no le llega la variable tabla.

Gracias.
  #8 (permalink)  
Antiguo 29/09/2005, 12:21
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
No hace lo que debería hacer, porque estás utilizando otra instancia, tu código debería ser más o menos así:
Código:
Dim frmSeleccion As Form4 = CType(AbrirVentana(GetType(Form4)), Form4)
frmSeleccion.sql = "select idejercicio,nombre,finalidad from Ejercicios"
frmSeleccion.tabla="Ejercicios"
frmSeleccion.Show
Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #9 (permalink)  
Antiguo 29/09/2005, 16:24
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Hola, muchas gracias pero me sigue dando error en el mismo sitio.
El error me lo da en la línea "adaptador.Fill(dsdatos, tabla)" de frmSeleccion
"Excepción no controlada del tipo 'System.ArgumentException' en system.data.dll
Información adicional: Fill: se esperaba una cadena con datos para el nombre de SourceTable."

Saludos
  #10 (permalink)  
Antiguo 29/09/2005, 21:41
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
No puedo hacer nada más si no pones más código (indentado...)

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #11 (permalink)  
Antiguo 30/09/2005, 01:54
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Hola, no sé qué código pegarte en concreto para que se entienda.
Yo creo q el problema está en que llamamos a la función AbrirVentana antes de dar valor a las variables sql y tabla (variables públicas de frmSeleccion) y entonces mostramos frmSeleccion y llega un momento en que hace las instrucciones del load y se encuentra que no tiene el valor tabla que necesita. Crees que puede ser eso?. A ver si encuentro como arreglarlo.

Gracias.
  #12 (permalink)  
Antiguo 30/09/2005, 12:51
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Hmm, entonces creo que deberías modificar dicho método (si es que no lo hiciste ya) quitando estas líneas, cosa que tu manejes cuándo se debe abrir o no la ventana:
Código:
If dialog Then
	formulario.ShowDialog()
Else
	formulario.Show()
End If
Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #13 (permalink)  
Antiguo 01/10/2005, 04:21
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Hola, muchas gracias. Ha funcionado n lo referente a q solo se abre una instancia y llegan ya los valores de las variables públicas a frmSeleccion pero no m hace lo q kiero pq aunq desde un botón de la barra de herramientas se abre un único formulario, desde los otros botones de la barra de herramientas no deja que se abran.

Yo estoy usando el mismo formulario frmSeleccion para todos los botones de la barra de herramientas pero este mismo formulario cambia dinámicamente según el botón que lo llame y entonces lo q kiero (q no se si se podrá) es q yo pueda llamar a una instancia de frmSeleccion a la vez desde cada botón pero una y solo una única instancia desde cada botón.

Saludos

Select Case ToolBar1.Buttons.IndexOf(e.Button)
Case 1 'Ejercicios
Dim frmSeleccion As Form4 = CType(AbrirVentana(GetType(Form4)), Form4)
frmSeleccion.sql = "select idejercicio,nombre,finalidad from Ejercicios"
frmSeleccion.tabla = "Ejercicios"
frmSeleccion.Show()

Case 2 'Proveedores
Dim frmSeleccion As Form4 = CType(AbrirVentana(GetType(Form4)), Form4)
frmSeleccion.sql = "select idproveedor,nombre,telefono1,telefono2 from Proveedores"
frmSeleccion.tabla = "Proveedores"
frmSeleccion.Show()

......
  #14 (permalink)  
Antiguo 01/10/2005, 14:17
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Como está la función ahorita es obvio que no funcione lo que describes, ya que se basa en el tipo de los formularios para evitar que haya más de una instancia, lo que puedes hacer es que en lugar de usar el tipo para hacer ese control, usar el nombre del botón que invoca al formulario o talvez una combinación del tipo del formulario+índice del boton en el toolbar.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #15 (permalink)  
Antiguo 03/10/2005, 10:17
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Hola. Xknown, muchas gracias por tu ayuda pero sigo atascada con esto . He intentado cambiar la función pasándole el nombre del botón pero no consigo nada. No kiero abusar de vuestra ayuda pero si m pudierais exar una mano..

Saludos.
  #16 (permalink)  
Antiguo 03/10/2005, 19:19
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Hola,

He intentado replicar el ambiente que tienes y he esto es lo que he modificado:
Código:
Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
    Dim frmSeleccion As Form4
    Select Case ToolBar1.Buttons.IndexOf(e.Button)
        Case 0
            frmSeleccion = AbrirVentana(GetType(Form4), 0)
            frmSeleccion.sql = "select idejercicio,nombre,finalidad from Ejercicios"
            frmSeleccion.tabla = "Ejercicios"
        Case 1
            frmSeleccion = AbrirVentana(GetType(Form4), 1)
            frmSeleccion.sql = "select idproveedor,nombre,telefono1,telefono2 from Proveedores"
            frmSeleccion.tabla = "Proveedores"
    End Select
    frmSeleccion.Show()
End Sub

Private Shared formInstances As New SortedList   ' Para guardar las referencias de las instancias de los formularios
Public Shared Function AbrirVentana(ByVal type As Type, Optional ByVal index As Integer = 0) As Form
    Dim Formulario As Form = formInstances(type.ToString() & index) ' No compila con "Option Strict", usar el de abajo
    ' Dim Formulario as Form = CType(formInstances(type.ToString()), Form)
    If Formulario Is Nothing OrElse Formulario.IsDisposed Then
        Formulario = Activator.CreateInstance(type) ' No compila con "Option Strict", usar el de abajo
        ' formulario = Ctype(Activator.CreateInstance(type), Form)
        formInstances(type.ToString() & index) = Formulario
    End If

    Formulario.Activate()
    Formulario.WindowState = FormWindowState.Normal

    Return Formulario
End Function
Como ves, ahora le paso como parámetro opcional el índice del botón que llama a dicha función, el cual se concatena con el tipo del formulario para controlar el número de instancias, si bien es una _solución_ que funciona, personalmente no me gusta...

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #17 (permalink)  
Antiguo 04/10/2005, 02:35
 
Fecha de Ingreso: abril-2005
Mensajes: 163
Antigüedad: 19 años
Puntos: 0
Hola, Xknown, muchísimas gracias!, va al perfección :). Jolín a tí no t gustará pero a mí m encanta , sobre todo en este caso q estaba atascada. ERes un crack d verdad, saludos.
  #18 (permalink)  
Antiguo 05/10/2005, 20:53
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 19 años, 3 meses
Puntos: 7
Me alegra de que te haya servido.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:46.