Colaboraciones en el Guille

Control de Ventanas

Controla las ventanas del navegador.

 

Fecha: 23/Dic/2005 (22-12-05)
Autor:Marc Julià Canal- marcjulia@menta.net

 

Nota del Guille (01/Abril/2006):
Hay una nueva versión (mejorada) de este mismo tema: Mejora del Control de Ventanas del Navegador

 


Diseñando un sistema de foros con la versión beta de Visual Studio 2005, tuve la necesidad de abrir partes del aplicativo en PopUps, lo cual me planteaba una serie de problemas, el primero era que una vez terminada la acción que tenia que realizar, básicamente insertar datos en la base de datos, la ventana quedaba abierta.

Mi intención como programador es facilitar las cosas al usuario final y me tuve que ingeniar un método para cerrar la ventana una vez esta había hecho su función.

El segundo problema era que cuando un usuario insertaba un mensaje, el programa para insertar registros se abría en un PopUp, pero al cerrar el PopUp, la página de mensajes seguía como antes, sin mostrar el mensaje.

Para ello necesitaba actualizar la ventana digamos le Padre una vez se cerrara la ventana digamos le Hija. Buscando información sobre el tema me encontré este articulo en msdn.

http://www.microsoft.com/spanish/msdn/articulos/archivo/160301/voices/webteam12042000.asp#windows

El problema es que actualizando me salía un mensaje de que estaba intentando actualizar la página , que lo solvente en vez de actualizando, redirigiéndolo.

Para Empezar cree una clase nueva a la que llame Control_Ventanas

Imports Microsoft.VisualBasic

Public Class Control_Ventanas

   '******************************************************************************************************
   '******************************************************************************************************
   '
   '                           INICIO DE LA FUNCIÓN DE 
   '                  ACTUALIZAR VENTANA PADRE AL CERRAR VENTANA HIJA
   '
   '
   ' Está Función se aplica a la ventana padre.
   ' Esta función se encarga de abrir una ventana hija
   ' Está función se llama desde JavaScript de la siguiente forma:
   '
   '  -->>Dim url As String = "NuevoMensaje.aspx?Categoria=" & Categoria
   '      Dim wh As String = "width=600,height=400"
   '      Ejecutar la funcion JavaScript de Abrir Ventana Hija 
   '      Dim strScript As String = ""
   '      strScript &= "<script language=JavaScript>" & vbCrLf
   '      strScript &= "openChild('" & url & "','" & wh & "')"
   '      strScript &= "</script>" & vbCrLf
   '      Me.Page.ClientScript.RegisterClientScriptBlock(Me.Page.GetType(), "EjecutarAbrirPopUp", strScript)
   '

   Public Sub Abrir_VentanaHija(ByVal pag As Page)

      Dim strScript As String = ""
      strScript &= "<script language=""jscript"">" & vbCrLf
      strScript &= "function openChild(URL,wh)" & vbCrLf
      strScript &= "{" & vbCrLf
      strScript &= "var winName='child'" & vbCrLf
      strScript &= "var winAtts=""toolbar=no,directories=no,top=0"";" & vbCrLf
      strScript &= "myChild = window.open(URL,winName,wh,winAtts);" & vbCrLf
      strScript &= "}" & vbCrLf
      strScript &= "</script>" & vbCrLf

      pag.ClientScript.RegisterClientScriptBlock(pag.GetType(), "VentanaPadre", strScript)

   End Sub

   ' Está función se aplica a la ventana Hija
   ' Esta función se encarga de Redireccionar en la ventana Padre cuando se cierra la ventana Hija.
   ' En el Html de la página Hija debe incluir * <body onload="setParent()" onunload="reloadParent()"> *
   '
   '   -->> Como entrada recibe la página a la que aplicar el script, la Url de la página Padre,
   '   -->> De forma opcional recibe la categoria.

   Public Sub ActualizarVentanaPadre_AlCerrar(ByVal pag As Page, ByVal url As String, Optional ByVal Categoria As String = "")

      Dim strScript As String = ""
      strScript &= "<script language=""jscript"">" & vbCrLf

      strScript &= "var pWin" & vbCrLf
      strScript &= "function setParent(){" & vbCrLf
      strScript &= "pWin = top.window.opener" & vbCrLf
      strScript &= "}" & vbCrLf

      strScript &= "function reloadParent(){" & vbCrLf
      'strScript &= "pWin.location.reload(true)" & vbCrLf

      If Categoria <> "" Then
         url &= "Categoria=" & Categoria
      End If

      strScript &= "pWin.location.href='" & url & "'" & vbCrLf
      strScript &= "}" & vbCrLf
      strScript &= "</script>" & vbCrLf

      pag.ClientScript.RegisterClientScriptBlock(pag.GetType(), "VentanaHija", strScript)

   End Sub

   '
   '                           FIN DEL SISTEMA DE REDIRECCIÓN AL
   '                               CERRAR VENTANA HIJA.
   '
   '******************************************************************************************************
   '******************************************************************************************************

   ' Función para cerrar la ventana del navegador transcurrido un determinado tiempo.
   '
   ' -->> Como entrada recibe la página a la que aplicar la función y el número de segundos 
   '     tras los cuales se cerrará la ventana del navegador.
   '
   Public Sub CerrarPantalla_TimeOut(ByVal pag As Page, ByVal Segundos As Integer)

      Dim strScript As String
      Segundos = Segundos * 1000

      strScript = "<script type=""text/javascript"">" & vbCrLf
      strScript &= "function cerrar() " & vbCrLf
      strScript &= "{" & vbCrLf
      strScript &= "var ventana = window.self" & vbCrLf
      strScript &= "ventana.opener = window.self" & vbCrLf
      strScript &= "ventana.close()" & vbCrLf
      strScript &= "}" & vbCrLf
      strScript &= "setTimeout(""cerrar()"", " & Segundos & ")" & vbCrLf
      strScript &= "</script>" & vbCrLf

      pag.ClientScript.RegisterStartupScript(pag.GetType(), "CerrarVentanaTimeOut", strScript)

   End Sub

   ' Función que Deshabilita el Click derecho del ratón en una página.
   '
   '   --> Como entrada recibe la página a la que aplicar la función.

   Public Sub Deshabilitar_ClickDerecho(ByVal pagina As Page)

      Dim strScript As String = ""
      strScript &= "<script language=JavaScript>" & vbCrLf
      strScript &= "var message="""";" & vbCrLf
      strScript &= "function clickIE() {if (document.all) {(message);return false;}}" & vbCrLf
      strScript &= "function clickNS(e) {if " & vbCrLf
      strScript &= "(document.layers||(document.getElementById&&!document.all)) {" & vbCrLf
      strScript &= "if (e.which==2||e.which==3) {(message);return false;}}}" & vbCrLf
      strScript &= "if (document.layers)" & vbCrLf
      strScript &= "{document.captureEvents(Event.MOUSEDOWN);document.onmousedown=clickNS;}" & vbCrLf
      strScript &= "else{document.onmouseup=clickNS;document.oncontextmenu=clickIE;}" & vbCrLf
      strScript &= "document.oncontextmenu=new Function(""return false"")" & vbCrLf
      strScript &= "</script>" & vbCrLf

      pagina.ClientScript.RegisterClientScriptBlock(pagina.GetType(), "noClickDerecho", strScript)

   End Sub


   ' Función que maximiza el tamaño de la ventana del navegador hasta la resolución
   ' que tenga el cliente establecida.
   '
   '   --> Como entrada recibe la  página a la que aplicar el script.

   Public Sub MaximizarVentana_TamañoPantalla(ByVal pagina As Page)

      Dim strScript As String = ""
      strScript &= "<script language=""JavaScript1.2"">" & vbCrLf
      strScript &= "window.moveTo(0,0);" & vbCrLf
      strScript &= "if (document.all) {" & vbCrLf
      strScript &= "top.window.resizeTo(screen.availWidth,screen.availHeight);" & vbCrLf
      strScript &= "}" & vbCrLf
      strScript &= "else if (document.layers||document.getElementById) {" & vbCrLf
      strScript &= "if (top.window.outerHeight<screen.availHeight||top.window.outerWidth<screen.availWidth){" & vbCrLf
      strScript &= "top.window.outerHeight = screen.availHeight;" & vbCrLf
      strScript &= "top.window.outerWidth = screen.availWidth;" & vbCrLf
      strScript &= "}" & vbCrLf
      strScript &= "}" & vbCrLf
      strScript &= "</script>" & vbCrLf

      pagina.ClientScript.RegisterClientScriptBlock(pagina.GetType(), "MaximizarPantalla", strScript)

   End Sub

End Class

La ventana Padre contiene un LinkButton y un Label
La forma de usar esta classe es creando una instancia de la clase en donde sea preciso.

Partial Class VentanaPadre_aspx
   Inherits System.Web.UI.Page
   ' Incializar la página
   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      Dim texto As String = Request.QueryString("texto")
      Dim ControlVentanas As New Control_Ventanas
      ControlVentanas.Abrir_VentanaHija(Me.Page)
      ControlVentanas.Deshabilitar_ClickDerecho(Me.Page)
      ControlVentanas.MaximizarVentana_TamañoPantalla(Me.Page)
      Me.Label1.Text = texto
   End Sub
   Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
      Dim url As String = "VentanaHija.aspx"
      Dim wh As String = "width=600,height=400"
      'Ejecutar la funcion JavaScript de Abrir Ventana Hija 
      Dim strScript As String = ""
      strScript &= "<script language=JavaScript>" & vbCrLf
      strScript &= "openChild('" & url & "','" & wh & "')"
      strScript &= "</script>" & vbCrLf
      Me.Page.ClientScript.RegisterClientScriptBlock(Me.Page.GetType(), "EjecutarAbrirPopUp", strScript)
   End Sub
End Class

La ventana Hija contiene un TextBox y un Button
No olvidéis de poner el la etiqueta body de la página que será la Hija los eventos:

<body onload="setParent()" onunload="reloadParent()">

Partial Class VentanaHija_aspx
   Inherits System.Web.UI.Page
   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
      '====================================================================================================
      '
      ' Función para actualizar la ventana Padre al cerrar la Hija (o sea está)
      ' En el Html de la página Hija (o sea está) debe incluir:
      '
      ' * <body onload="setParent()" onunload="reloadParent()"> *
      '
      Dim url As String = "VentanaPadre.aspx?texto=" & Me.TextBox1.Text.Trim
      Dim ControlVentanas As New Control_Ventanas
      ControlVentanas.ActualizarVentanaPadre_AlCerrar(Me.Page, url.Trim)
   End Sub
   Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
      If Me.TextBox1.Text = "" Then
         Me.TextBox1.Text = "Escriba algo aquí"
      Else
         ' si ha escrito algo ejecutar la función de cerrar ventana, que activará el evento
         Dim ControlVentanas As New Control_Ventanas
         ControlVentanas.CerrarPantalla_TimeOut(Me.Page, 1)
      End If
   End Sub
End Class

 

 

En fin espero que os sea de utilidad.

 


Fichero con el código de ejemplo: mcanal_ControlVentanas.zip - (5) KB


ir al índice principal del Guille