none
pasar variables de session de popup hija a pagina padre RRS feed

  • Pregunta

  • Hola a Todos, buenas tardes, estoy investigando y no se si estoy en lo cierto o no, tratando de hacer lo siguiente: tengo una pagina padre que tiene cajas de texto que son cargados siempre primeros....antes de ir a otra pagina a buscar datos de variables de session, y como estas cajas de texto se cargan antes, los valores de session se pierden si usara una pagina hija webform, entonces intento usando un popup como hija para buscar la variable de session que necesito para cargar la caja de texto que necesito cargar en la pagina padre(no siempre sera usado esta opcion, depende del tipo de pago que haga el cliente, que pueden ser varios) y solo cuando es por banco va a buscar el dato del banco en el popup, por eso busque esta opcion...tengo el siguiente codigo hasta ahora:

    pagina padre:

    protected void ImageButton1_Click(object sender, ImageClickEventArgs e)// voy al popup como hija
        {
         
            ImageButton1.Attributes.Add("onclick", "javascript:urlBanco();");
          
        }

    y por detras tengo esto

    </script>
         <script language="javascript" type="text/javascript">
                function urlBanco() {
         hidden = open('VerBancos.aspx','NewWindow','top=0,left=0,width=0,height=0,status=yes,resizable=yes,scrollbars=yes');
         hidden .focus ()
                         }
                                  
        </script>

    ...............hasta aca funciona ok......voy a la hija sin problemas...........................

    pagina hija popup:

    tengo un gridview donde obtengo las variables de session

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        { //variables de session para el banco elegido en el recibo
            GridViewRow row = GridView1.SelectedRow;
            Session["Numero"] = row.Cells[1].Text;
            Session["Banco"] = row.Cells[3].Text;

            string str_java;
            str_java = "<script language='javascript'>";
            str_java += " window.close();";
            str_java += "</script>";
            lt_enviar.Text = str_java;

    }

    ...................Bueno hasta aca pude llegar, no se como poner el script (lei algo de window.opener) pero no puedo comprender como llevar las variables de session al padre que lo llamo........alguien tiene alguna idea? o me puede decir si voy en buen camino???...desde ya gracias

    martes, 25 de octubre de 2011 20:25

Respuestas

  • bien pero que hace que Recibo se recargue

    o sea en que punto cierras la pagina popup de VerBancos ? cuando seleccionas del grid asignas las session y envias el window.close() de javascript ?

    a donde apunto es que luego de seleccionar un banco, asignando las session en el SelectedIndexChanged, pero no veo dodne cierras esa pagina y realzias la recarga de la pagina padre

    podrias lanzar

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    { 
    
    	GridViewRow row = GridView1.SelectedRow;
    	Session["Numero"] = row.Cells[1].Text;
    	Session["Banco"] = row.Cells[3].Text;
    
    	string str_java = @"<script language='javascript'>
    						  opener.location.reload();
    						  window.close();
    					   </script>";
    						
    	ScriptManager.RegisterStartupScript(this, typeof(Page), "cerrarpagina", str_java, false) ;
    
    }

     

    esto hace el la pagina padre se recarga y cierras la de VerBancos

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Laura Arevalo miércoles, 26 de octubre de 2011 19:30
    miércoles, 26 de octubre de 2011 12:38
  • En tu caso seria asi

    string str_java = @"<script language='javascript'>
            window.opener.__doPostBack('cambiosrealizados','');
            window.close();
       </script>"
    ;

    ScriptManager.RegisterStartupScript(this, typeof(Page), "cerrarpagina", str_java, false) ;

    y en el load de la pagina padre

      protected void Page_Load(object sender, EventArgs e)
        {
           
            Page.GetPostBackEventReference(Page);


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Saludos. Lima-Perú
    • Marcado como respuesta Laura Arevalo miércoles, 26 de octubre de 2011 19:30
    miércoles, 26 de octubre de 2011 16:27

Todas las respuestas

  • pero noto algo incompatible, porque defines el evento SelectedIndexChanged y a la vez lanzas una accion desde el cliente

    por lo tanto deberia seguir uan secuencia

     

    esta linea

    ImageButton1.Attributes.Add("onclick", "javascript:urlBanco();");

    no deberia esta

    y deberias hacer

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    { 
    
    	GridViewRow row = GridView1.SelectedRow;
    	Session["Numero"] = row.Cells[1].Text;
    	Session["Banco"] = row.Cells[3].Text;
    
    	string str_java = @"<script language='javascript'>
    						  urlBanco();
    						  window.close();
    					   </script>";
    						
    	ScriptManager.RegisterStartupScript(this, typeof(Page), "abrirpagina", str_java, false) ;
    
    }
    

    o sea debes realziar el postback y a la vuelta es que abres la pagina

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 25 de octubre de 2011 20:34
  • el padre llama a la hija con ImageButton1.Attributes.Add("onclick", "javascript:urlBanco();"); y es webform

    ...................................................................................

    la hija tiene la grilla (esta es la hija) y es popup

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    { 
    
    	GridViewRow row = GridView1.SelectedRow;
    	Session["Numero"] = row.Cells[1].Text;
    	Session["Banco"] = row.Cells[3].Text;
    .......
    }

    y de la hija quiero llevar las variables de session al padre para cargar una caja de texto
    martes, 25 de octubre de 2011 21:04
  • claro pero no estan sincronizados los eventos

    se eejcuta primero el window.open

    y luego el post del evento, por eso en la otra pagina no dispones de los datos en la session, debes dar una secuencia:

    - el postback al evento,

    - asignar las session

    - y luego el popup a la otra ventana

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 25 de octubre de 2011 21:08
  • y como hago la llamada desde el padre a mi popup hija si quito esta linea?

    ImageButton1.Attributes.Add("onclick", "javascript:urlBanco();");

     

    martes, 25 de octubre de 2011 22:08
  • claro debe quitar esa linea, el ImageButton imagino lanza el evento GridView1_SelectedIndexChanged

    por lo tanto cuendo vuelve es que hara el open, porque el ScriptManager registrara el javascript que hara justamente eso


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 25 de octubre de 2011 23:44
  • Hola disculpame Leandro me parece que no te estoy entendiendo, el imagebutton esta en la pagina padre y dispara el evento que llama a la popup, el que dispara el GridView1_SelectedIndexChanged es en la popup hija
    miércoles, 26 de octubre de 2011 11:44
  • ahora soy yo en el que no entendi

    podrias describir que pagina contiene que funcionalidad

    proque VerBancos.aspx, no podria contener el javascript con al funcion urlBanco() o el boton ImageButton1

    porque este es el que abre el popup, esto deberia estar en la pagina padre

    entocnes se supone que el ImageButton deberia tener un evento del servidor en dodne se asignen las session

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 26 de octubre de 2011 12:16
  • ahora si me entendiste

    pagina padre: es el Recibo

    protected void ImageButton1_Click(object sender, ImageClickEventArgs e)// voy al popup como hija
        {
         
            ImageButton1.Attributes.Add("onclick", "javascript:urlBanco();");
          
        }

    ***********************************************************************

    popup hija : es ver bancos

    tengo un gridview donde obtengo las variables de session

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        { //variables de session donde elijo un banco y lo llevo al recibo
    miércoles, 26 de octubre de 2011 12:20
  • bien pero que hace que Recibo se recargue

    o sea en que punto cierras la pagina popup de VerBancos ? cuando seleccionas del grid asignas las session y envias el window.close() de javascript ?

    a donde apunto es que luego de seleccionar un banco, asignando las session en el SelectedIndexChanged, pero no veo dodne cierras esa pagina y realzias la recarga de la pagina padre

    podrias lanzar

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
    { 
    
    	GridViewRow row = GridView1.SelectedRow;
    	Session["Numero"] = row.Cells[1].Text;
    	Session["Banco"] = row.Cells[3].Text;
    
    	string str_java = @"<script language='javascript'>
    						  opener.location.reload();
    						  window.close();
    					   </script>";
    						
    	ScriptManager.RegisterStartupScript(this, typeof(Page), "cerrarpagina", str_java, false) ;
    
    }

     

    esto hace el la pagina padre se recarga y cierras la de VerBancos

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Laura Arevalo miércoles, 26 de octubre de 2011 19:30
    miércoles, 26 de octubre de 2011 12:38
  • Si señor asi me anda, ahi nos entendimos Leandro gracias, me faltaba esa linea
    ScriptManager.RegisterStartupScript(this, typeof(Page), "cerrarpagina", str_java, false) ;

    ahora te pregunto sin abusar de tu generosidad,y preguntarte si hay una manera de que no salga el mensaje de reintentar? cuando
    me pide la actualizacion de la pagina padre? o sea que lo haga solo sin tener que presionar el boton reintentar???
    miércoles, 26 de octubre de 2011 12:50
  • preguntarte si hay una manera de que no salga el mensaje de reintentar?

    mm que raro que muestre ese mensaje, debe ser algo del blowser

    podriasver de usar

    opener.location.href='Recibo.aspx';

    o sea en lugar de hacer un reload, le indicas que use la url de la propia pagina, seria mas o menos lo mismo que el reload

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 26 de octubre de 2011 12:59
  • usando el

    window.opener.document.location= 'mipagina';

    o el.......... opener.location.href='Recibo.aspx'; o el .........window.opener.location.href = window.opener.location.href; 

    me hacen lo mismo, me blanquea los datos cargados en la pagina padre, solo me funciona bien con el reload () pero me sale la ventanita de reintentar

    miércoles, 26 de octubre de 2011 13:16
  • hola por ahi este codigo te ayuda en algo , si tienes dos webform uno padre y el otro hijo

    en el que invoca al formulario hijo podria ser

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Untitled Page</title>
        <script type="text/javascript">
            function f1() {
                window.open("Default2.aspx");    
             } </script> 
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <br />
           <input type="button" onclick="f1();" value="pop up" />
     </div>
        </form>
    </body>
    </html>

    y en el codebehind

      protected void Page_Load(object sender, EventArgs e)
        {
            if ((Session["ToParentDataNombre"] != null))
                    {
                      TextBox1.Text = Session["ToParentDataNombre"].ToString();
    }
    

    y luego en el que es el pop up

        protected void Page_Load(object sender, EventArgs e)
        {
            llenardatatatable();
            }
    
        private void llenardatatatable()
        {
            DataTable mitabla = new DataTable();           
                    mitabla.Columns.Add("id");  
            mitabla.Columns.Add("nombre");   
            mitabla.Columns.Add("descripcion"); 
            mitabla.Columns.Add("precio");   
            mitabla.Columns.Add("marca");         
            DataRow fila = mitabla.NewRow();     
            fila[0] = 0001;    
            fila[1] = "chaqueta";
            fila[2] = "botones de plata";     
            fila[3] = "50.000";    
            fila[4] ="mimarca";        
            mitabla.Rows.Add(fila);         
            this.GridView1.DataSource = mitabla; 
            this.GridView1.DataBind();  
    
        }
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    
    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) {
     Session["ToParentDataNombre"] = TextBox1.Text; ClientScript.RegisterClientScriptBlock(Page.ClientScript.GetType(), "Test", " <script type=\"text/javascript\"> javascript:window.opener.document.location.reload();self.close() </script> "); 
    } 

    y en html

    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    

     No lo he probado pero me parece que si puede funcionar , por ahi deberias hacerle alguna valdiacion pero segun he leido tus post por ahi te puede ayudar.


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Saludos. Lima-Perú

     

    • Editado Augusto1982 miércoles, 26 de octubre de 2011 13:44
    miércoles, 26 de octubre de 2011 13:36
  • me blanquea los datos cargados en la pagina padre

    como solo blanquea ?

    deberia recargar los datos, de casualidad usas algun querystring en la url de la pagina

    porque si es asi deberias ponerlo en la linea

    opener.location.href='Recibo.aspx?id=10';

    el 10 es solo un ejemplo, alli deberia ir el id de la entidad que editas

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 26 de octubre de 2011 13:37
  • me blanquea las cajas de texto que cargue antes de ir a buscar el dato en el popup, por eso intento de usar un popup para que el postback de ir a una pagina comun al recargar la pagina no me deje en blanco lo que el usuario ya cargo antes, y hay muchisimo codigo en la pagina padre para estar guardando en variables esos datos antes de disparar algo, si uso querys en la pagina padre pero eso me anda perfecto, las cajas de texto es el tema que son las que carga el usuario luego va a la hija y busca el banco, y despues de esto al tener todos los datos hara el insert
    miércoles, 26 de octubre de 2011 13:46
  • En tu caso seria asi

    string str_java = @"<script language='javascript'>
            window.opener.__doPostBack('cambiosrealizados','');
            window.close();
       </script>"
    ;

    ScriptManager.RegisterStartupScript(this, typeof(Page), "cerrarpagina", str_java, false) ;

    y en el load de la pagina padre

      protected void Page_Load(object sender, EventArgs e)
        {
           
            Page.GetPostBackEventReference(Page);


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Saludos. Lima-Perú
    • Marcado como respuesta Laura Arevalo miércoles, 26 de octubre de 2011 19:30
    miércoles, 26 de octubre de 2011 16:27
  • Quedo perfecto, ahi me hace todo como necesitaba, abre el popup hija y  tomo la variable de session , lo llevo al webform padre y sin perder las cajas de texto que previamente estan cargados en el padre, y sin que me salga el boton reintentar en el navegador, muchisimas gracias Leandro y Augusto...me sirvió muchisimo su ayuda...el codigo queda asi:

    el load del padre:

    protected void Page_Load(object sender, EventArgs e)
        {
          
            this.Page.Title = "Recibo";
            Page.GetPostBackEventReference(Page);

    }

    y en el popup hija:

    protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
        { //variables de session para el banco elegido en el recibo
           
            GridViewRow row = GridView1.SelectedRow;
            Session["Numero"] = row.Cells[1].Text;
            Session["Banco"] = row.Cells[3].Text;

            string str_java = @"<script language='javascript'>
                              window.opener.__doPostBack('cambiosrealizados','');                      
                               window.close();
                           </script>";

            ScriptManager.RegisterStartupScript(this, typeof(Page), "cerrarpagina", str_java,false);
           
        }
       

     


    miércoles, 26 de octubre de 2011 19:34