Duda con PostBack y evento SelectedIndexChanged

publicado por: Anonymous

Primero que nada, les pido perdón porque no puedo presentar código. El problema es el siguiente en una aplicacion asp.net webforms, tengo 2 listbox y cada uno tiene el evento de SelectedIndexChanged, (el código dentro de esos eventos es simplemente mover un item de una lista a la otra y viceversa) los cuales se manejan cuando hay PostBack y cuando algún elemento está seleccionado. Tengo 1 simple boton con el evento de click pero sin código, digamos que simplemente sirve para hacer PostBack. Ahora, el problema surge porque tengo otro botón el cual activa otro evento pero si yo tengo algun item seleccionado de alguna de las listbox, lo que se ejecuta es primero el evento de SelectedIndexChanged y luego el evento al que llama el segundo botón y en realidad solo quiero que se ejecute el evento del segundo botón, me explico? Cómo podría evitar esto?

introducir la descripción de la imagen aquí

Como ven en esta imagen de ejemplo, si yo doy click en el botón de Save, al tener seleccionado un item del listbox de la izquierda, lo que hace la aplicación es llamar al evento SelectedIndexChanged de ese listbox y recién luego de eso llama al evento de Save, y esto funciona asi por la cuestión del PostBack. Hay alguna buena forma para implementar que evite eso?

solución

podrías hacer uso del control UpdatePanel de las extensiones Ajax (el cual ya está pre-instalado en Visual Studio), y son utilizados para hacer postback solo en la porción de la pagina que encierran, acomoda tus ListBox y UpdatePanel algo así:

<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:ListBox ID="ListBox1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ListBox1_SelectedIndexChanged">
                    <asp:ListItem Value="0">Item 1</asp:ListItem>
                    <asp:ListItem Value="1">Item 2</asp:ListItem>
                </asp:ListBox>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="ListBox2" EventName="SelectedIndexChanged" />
            </Triggers>
        </asp:UpdatePanel>
        <br />
        <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:ListBox ID="ListBox2" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ListBox2_SelectedIndexChanged">
                    <asp:ListItem Value="0">Item 3</asp:ListItem>
                    <asp:ListItem Value="1">Item 4</asp:ListItem>
                </asp:ListBox>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="ListBox1" EventName="SelectedIndexChanged" />
            </Triggers>
        </asp:UpdatePanel>
        <br />
        <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

Ahora te explico:

  • El ScriptManager es requisito para utilizar los UpdatePanel.
  • Nota que estos tienen la propiedad UpdateMode=”Conditional” que sirve para condicionar que eventos van a disparar el postback dentro de ellos.
  • Pon la propiedad AutoPostBack=”True” en los ListBox ya que por default esta en false y es necesaria para enviar datos al servidor y obtener la respuesta.
  • Las etiquetas “Triggers” y “asp:AsyncPostBackTrigger” las puse para determinar que evento va a disparar la actualización del UpdatePanel. (los controles con autopostback dentro de su UpdatePanel dispararan el evento por si mismo sin necesidad de identificarlo en la etiqueta Triggers) Y porque para actualizar el ViewState es necesario hacer postback, así que ambos ListBox dependen de uno y el otro para cambiar su vista. Adaptalo a tu código ASP y cuentame si te funciono. Saludos.
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *