none
Segundo evento en un updatePanel cierra user control en aspx RRS feed

  • Pregunta

  • Hola buenas noches,

    Disculpen tengo un problema en asp.net, estoy mostrando varios user controls  desde code behind en c#, pero tengo un problema:

    1.- estoy evitando el postback en toda  la pagina cuando selecciono una opción en un dropdownlist en el evento SelectedIndexChanged 

    2.- He solucionado esto con un updatePanel metiendo el codigo de la siguiente forma:

     <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <div class="form-group row">
                        <label for="ddlClaseActivo" class="col-xs-3 control-label text-right">
                            Clase de Activo:*</label>
                        <div class="col-xs-6">
                            <asp:DropDownList runat="server" CssClass="form-control" ID="ddlClaseActivo" AutoPostBack="True"
                                onselectedindexchanged="ddlClaseActivo_SelectedIndexChanged" />
                        </div>
                    </div>
                    <div class="form-group row">
                        <label class="col-xs-3 control-label text-right" for="tp_contr_oper">
                            Tipo contrato operación:*</label>
                        <div class="col-xs-6 ">
                            <asp:DropDownList runat="server" CssClass="form-control" ID="tp_contr_oper" AutoPostBack="True"
                                OnSelectedIndexChanged="tp_contr_oper_SelectedIndexChanged" />
                        </div>
                    </div>
                   <div runat="server" id="Container">
                        <asp:Panel ID="pnlInfoComplementa" runat="server">
                        </asp:Panel>
                        <hr />
                    </div>
                    </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="tp_contr_oper" EventName="SelectedIndexChanged" />
                    <asp:AsyncPostBackTrigger ControlID="ddlClaseActivo" EventName="SelectedIndexChanged" />
                </Triggers>
            </asp:UpdatePanel>

    ddlClaseActivo: es el primer dropdowlist que quiero evitar que haga un postaback en el evento SelectedIndexChanged

    tp_contr_oper: es otro dropdowlist que de igual forma quiero que evite postback en el mismo evento, a diferencia que este dependiendo la opción muestra un diferente user control.

    pnlInfoComplementa: es en donde inserto mi user control

    3.- Mi codigo en c# es el siguiente:

     protected void tp_contr_oper_SelectedIndexChanged(object sender, EventArgs e)
            {
                var virtualPath = "";
     
                switch (int.Parse(tp_contr_oper.SelectedValue))
                {
                    case 8: 
                        virtualPath = "~/UserControl/RVCommodities.ascx";
                        break;
                    case 1:
                        virtualPath = "~/UserControl/RVDerivados.ascx";  
                        break;
                }
    
                if (!String.IsNullOrEmpty(virtualPath))
                {
                    AgregarUserControl(virtualPath);
                }
            }
    
       void AgregarUserControl(string _virtualPath)
            {
                System.Web.UI.UserControl uc = (System.Web.UI.UserControl)Page.LoadControl(_virtualPath);
                pnlInfoComplementa.Controls.Add(uc);
            }  

    El problema: Cuando selecciono el dropdown tp_contr_oper me filtra la opción y me muestra el respectivo user control, pero cuando selecciono el dropdown ddlClaseActivo el evento refresca el panel y el user control desaparece.

    No encuentro una solución a este problema, espero puedan ayudarme se los agradecería.

    Saludos

    sábado, 17 de junio de 2017 1:25

Respuestas

  • En ASP.NET, a cada PostBack se vuelve a generar la página y se envía de vuelta al navegador (o se envía de vuelta solo el contenido del UpdatePanel si es un Postback parcial). Durante ese proceso de "volver a generar la página", se conservan los valores de las propiedades de los controles gracias al ViewState, que se guarda en un campo Hidden. Pero el ViewState solo guarda los valores de las propiedades, no guarda los propios controles en sí mismos. Si son controles "fijos", los regenera desde el diseño del .aspx. Pero si los has construido dinámicamente, se pierden. Es necesario que los vuelvas a generar de nuevo en cada uno de los postbacks (tanto si son completos como si son parciales). En consecuencia, si has agregado un UserControl en un evento, y luego desencadenas otro evento distinto, lo que agregaste en el primero se pierde. Es necesario que conserves una lista de todo lo que has agregado, y que a cada postback lo vuelvas a agregar. Si la lista la salvas en el ViewState, puedes volverla a leer en el Page_Load (que se dispara en todos los postbacks, incluidos los postbacks parciales del UpdatePanel), y de conformidad con lo que diga la lista volver a agregar todos los controles que tenías.
    sábado, 17 de junio de 2017 9:13