Search code examples
c#asp.netasynchronousupdatepanel

position of control is changed after asynchronous postback


i have a panel within an update panel in my page visible of panel is false by default and after asynchronous postback changes to true my problem is after postback location of panel change to top of page here is my code

<asp:Label runat="server" ID="lbl_caption_upload" Text="caption" CssClass="label"></asp:Label>
<asp:TextBox runat="server" ID="txt_caption_upload" TextMode="MultiLine" CssClass="textbox"></asp:TextBox>
<asp:RadioButtonList runat="server" ID="radio_view_upload" OnSelectedIndexChanged="radio_view_upload_SelectedIndexChanged" AutoPostBack="True">
   <asp:ListItem text="custom"></asp:ListItem>
   <asp:ListItem text="public"></asp:ListItem></asp:RadioButtonList>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="radio_view_upload" />
                </Triggers>
                <ContentTemplate>
                    <asp:Panel runat="server" ID="placeholder_panel" Visible="false" CssClass="hide">
                        <tr>
                            <td>
                                <asp:Label runat="server" ID="lbl_genre_upload" Text="genre" CssClass="label"></asp:Label>
                            </td>
                            <td>
                                <asp:CheckBoxList runat="server" ID="check_genre_upload" DataTextField="Title" DataValueField="ID" RepeatColumns="7" RepeatDirection="Horizontal" DataSourceID="datasource_genre_upload"></asp:CheckBoxList>
                                <asp:LinqDataSource ID="datasource_genre_upload" runat="server" ContextTypeName="Video_Hosting.L2SDataContext" EntityTypeName="" Select="new (Title, ID)" TableName="Genres" OrderBy="ID">
                                </asp:LinqDataSource>
                            </td>
                        </tr>
                    </asp:Panel>
                </ContentTemplate>
            </asp:UpdatePanel>

and here is code for slectedindex change

protected void radio_view_upload_SelectedIndexChanged(object sender, EventArgs e)
    { 
        if (radio_view_upload.SelectedIndex == 1)
        {
            placeholder_panel.Visible = true;
        } 
        else
        {
            placeholder_panel.Visible = false;
        }
    }

after postback location of panel change to before first label

thanks for all of your answers


Solution

  • This line is the problem:

    if (radio_view_upload.SelectedIndex == 2)
    

    Your radio_view_upload RadioButtonList only has 2 choices, so your if-statement will always go to the Else part. Only SelectedIndex 0 and 1 are available.

    In most programming languages the first item in an array, collection, list etc will have 0 as starting index.

    You could also use if (radio_view_upload.SelectedValue == "myValue"), but for this to work you have to add a value="myValue" to the ListItems.

    UPDATE

    Inside <ContentTemplate> you have a <tr> <td> and a </td> </tr> without matching <table> </table> tags. Maybe those tags are outside the UpdatePanel and not visible in your snippet. You should add/move those inside the UpdatePanel.

    UPDATE 2

        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <br />
        <br />
        <asp:Label runat="server" ID="lbl_caption_upload" Text="caption" CssClass="label"></asp:Label>
        <br />
        <asp:TextBox runat="server" ID="txt_caption_upload" TextMode="MultiLine" CssClass="textbox"></asp:TextBox>
        <br />
        <asp:RadioButtonList runat="server" ID="radio_view_upload" OnSelectedIndexChanged="radio_view_upload_SelectedIndexChanged" AutoPostBack="True">
            <asp:ListItem Text="custom"></asp:ListItem>
            <asp:ListItem Text="public"></asp:ListItem>
        </asp:RadioButtonList>
        <br />
    
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="radio_view_upload" />
            </Triggers>
            <ContentTemplate>
                <asp:Panel runat="server" ID="placeholder_panel" Visible="true" CssClass="hide">
                    <asp:Label runat="server" ID="lbl_genre_upload" Text="genre" CssClass="label"></asp:Label>
                    <br />
                    <asp:CheckBoxList runat="server" ID="check_genre_upload" DataTextField="Title" DataValueField="ID" RepeatColumns="7" RepeatDirection="Horizontal"></asp:CheckBoxList>
                </asp:Panel>
            </ContentTemplate>
        </asp:UpdatePanel>