locked
Repeater causes whole page to reload inside update panel RRS feed

  • Question

  • User-1526035670 posted

    Hi all

    Below is my code which uses GetData to load a repeater with data and the second repeater (rptPaging) is used for pagination.

           <asp:UpdatePanel ID="upPanel" runat="server">
            <ContentTemplate>
                <asp:Repeater ID="rptUsers" runat="server" OnItemDataBound="rptUsers_OnItemDataBound">
                    <ItemTemplate>
                        // Generic display controls i.e. labels
                    </ItemTemplate>
                </asp:Repeater>
                    <asp:Repeater ID="rptPaging" runat="server" OnItemCommand="rptPaging_ItemCommand">
                    <ItemTemplate>
                        <asp:LinkButton ID="btnPage"
                                        style="padding:8px;margin:2px;background:#ffa100;border:solid 1px #666;font:8pt tahoma;"
                                        CommandName="Page" CommandArgument="<%# Container.DataItem %>"
                                        runat="server" ForeColor="White" Font-Bold="True">
                            <%# Container.DataItem %>
                        </asp:LinkButton>
                    </ItemTemplate>
                </asp:Repeater>
            </ContentTemplate>
        </asp:UpdatePanel>

    Code behind

    private void GetData()
            {
                //Create the PagedDataSource that will be used in paging
                PagedDataSource pgitems = new PagedDataSource();
                pgitems.DataSource = getaData();
                pgitems.AllowPaging = true;
    
                //Control page size from here 
                pgitems.PageSize = 10;
                pgitems.CurrentPageIndex = PageNumber;
                if (pgitems.PageCount > 1)
                {
                    rptPaging.Visible = true;
                    ArrayList pages = new ArrayList();
                    for (int i = 0; i <= pgitems.PageCount - 1; i++)
                    {
                        pages.Add((i + 1).ToString());
                    }
                    rptPaging.DataSource = pages;
                    rptPaging.DataBind();
                }
                else
                {
                    rptPaging.Visible = false;
                }
    
                rptUsers.DataSource = pgitems;
                rptUsers.DataBind();
            }
    		
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                    GetData();
                }
            }

    protected void rptPaging_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e)
    {
        PageNumber = Convert.ToInt32(e.CommandArgument) - 1;
        GetData();
    }

    The issue i am facing is when the page number is clicked it forces a full page refresh. I have attempted a couple of changes on the UpdatePanel i.e. adding Conditional update but nothing stops the page from a full reload.

    Any pointers? Or have i missed some basic configuration somewhere?

    Thanks 

    Thursday, July 23, 2020 2:24 PM

Answers

  • User-939850651 posted

    Hi JamieP1,

    Based on your description, I created a simple example to reproduce your problem.

    I modified part of the code, and now it can switch page numbers normally without refreshing the entire page.

    Please refer to code below:

    Page code:
    
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:ScriptManager ID="ScriptManager" runat="server" />
                <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
                    <ContentTemplate>
                        <asp:Repeater ID="Repeater1" runat="server">
                            <HeaderTemplate>
                                <center>
                                    <h1>Test Table</h1>
                                <table class="tableData" cellpadding="0" cellspacing="0" border="1">
                                    <tr>
                                        <th style="width:50px">ID</th>
                                        <th style="width:110px">column1</th>
                                        <th style="width:110px">column2</th>
                                        <th style="width:110px">column3</th>
                                    </tr>
                            </HeaderTemplate>
                            <FooterTemplate>
                                </table>
                            </FooterTemplate>
                            <ItemTemplate>
                                <tr>
                                    <td style="text-align: center"><%# Eval("id") %></td>
                                    <td style="text-align: center"><%# Eval("col_name1") %></td>
                                    <td style="text-align: center"><%# Eval("col_name2") %></td>
                                    <td style="text-align: center"><%# Eval("col_name3") %></td>
                                </tr>
                                </center>
                            </ItemTemplate>
                        </asp:Repeater>
                        <asp:Repeater ID="rptPages" runat="server">
                            <HeaderTemplate>
                                <table cellpadding="0" cellspacing="0" border="0">
                                    <tr class="text">
                                        <td>
                            </HeaderTemplate>
                            <ItemTemplate>
                                <asp:LinkButton ID="btnPage" CommandName="Page" CommandArgument="<%# Container.DataItem %>"
                                    runat="server"><%# Container.DataItem %>
                                </asp:LinkButton>&nbsp;
                            </ItemTemplate>
                            <FooterTemplate>
                                </td> </tr> </table>
                            </FooterTemplate>
                        </asp:Repeater>
                        <br />
                       A TextBox: <asp:TextBox ID="text" runat="server"></asp:TextBox>
                    </ContentTemplate>
                </asp:UpdatePanel>
            </div>
        </form>
    </body>
    protected int CurrentPage
            {
                get
                {
                    // look for current page in ViewState
                    object o = this.ViewState["_CurrentPage"];
                    if (o == null)
                        return 0;   // default to showing the first page
                    else
                        return (int)o;
                }
                set
                {
                    this.ViewState["_CurrentPage"] = value;
                }
            }
    
            protected int PageCount
            {
                get
                {
                    // look for current page count in ViewState
                    object o = this.ViewState["_PageCount"];
                    if (o == null)
                        return 1;   // default to just 1 page
                    else
                        return (int)o;
                }
                set
                {
                    this.ViewState["_PageCount"] = value;
                }
            }
    
            private static DataSet getData() {
                DataSet ds = new DataSet();
                string conStr = ConfigurationManager.ConnectionStrings["conStr"].ToString();
                using (SqlConnection conn = new SqlConnection(conStr)) {
                    string query = "select * from simpletb";
                    using (SqlCommand cmd = new SqlCommand(query, conn)) {
                        SqlDataAdapter sda = new SqlDataAdapter(cmd);
                        sda.Fill(ds);
                    }
                }
                return ds;
            }
    
            protected void GetItems()
            {
                PagedDataSource pagedData = new PagedDataSource();
                pagedData.AllowPaging = true;
                pagedData.PageSize = 10;
                pagedData.DataSource = getData().Tables[0].DefaultView;
                pagedData.CurrentPageIndex = CurrentPage;
    
                PageCount = pagedData.PageCount;
    
                // Wire up the page numbers
                if (pagedData.PageCount > 1)
                {
                    rptPages.Visible = true;
                    ArrayList pages = new ArrayList();
                    for (int i = 0; i < pagedData.PageCount; i++)   
                        if (i == CurrentPage)
                        {
                            pages.Add("<b>" + (i + 1).ToString() + "</b>");
                        }
                        else
                        {
                            pages.Add((i + 1).ToString());
                        }
                    rptPages.DataSource = pages;
                    rptPages.DataBind();
                }
                else
                {
                    rptPages.Visible = false;
                }
                Repeater1.DataSource = pagedData;
                Repeater1.DataBind();
            }
    
           protected void rptPages_ItemCommand(object source,RepeaterCommandEventArgs e)
            {
                CurrentPage = Convert.ToInt32(e.CommandArgument) - 1;
                GetItems();
            }
    
            protected override void OnInit(EventArgs e)
            {
                base.OnInit(e);
                rptPages.ItemCommand += new RepeaterCommandEventHandler(rptPages_ItemCommand);
            }
    
            protected override void OnLoad(EventArgs e)
            {
                base.OnLoad(e);
                GetItems();
            }

    I set up a text input box to test, and result:

    Hope this can help you.

    Best regards,

    Xudong Peng

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Friday, July 24, 2020 7:09 AM

All replies

  • User-939850651 posted

    Hi JamieP1,

    Based on your description, I created a simple example to reproduce your problem.

    I modified part of the code, and now it can switch page numbers normally without refreshing the entire page.

    Please refer to code below:

    Page code:
    
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:ScriptManager ID="ScriptManager" runat="server" />
                <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
                    <ContentTemplate>
                        <asp:Repeater ID="Repeater1" runat="server">
                            <HeaderTemplate>
                                <center>
                                    <h1>Test Table</h1>
                                <table class="tableData" cellpadding="0" cellspacing="0" border="1">
                                    <tr>
                                        <th style="width:50px">ID</th>
                                        <th style="width:110px">column1</th>
                                        <th style="width:110px">column2</th>
                                        <th style="width:110px">column3</th>
                                    </tr>
                            </HeaderTemplate>
                            <FooterTemplate>
                                </table>
                            </FooterTemplate>
                            <ItemTemplate>
                                <tr>
                                    <td style="text-align: center"><%# Eval("id") %></td>
                                    <td style="text-align: center"><%# Eval("col_name1") %></td>
                                    <td style="text-align: center"><%# Eval("col_name2") %></td>
                                    <td style="text-align: center"><%# Eval("col_name3") %></td>
                                </tr>
                                </center>
                            </ItemTemplate>
                        </asp:Repeater>
                        <asp:Repeater ID="rptPages" runat="server">
                            <HeaderTemplate>
                                <table cellpadding="0" cellspacing="0" border="0">
                                    <tr class="text">
                                        <td>
                            </HeaderTemplate>
                            <ItemTemplate>
                                <asp:LinkButton ID="btnPage" CommandName="Page" CommandArgument="<%# Container.DataItem %>"
                                    runat="server"><%# Container.DataItem %>
                                </asp:LinkButton>&nbsp;
                            </ItemTemplate>
                            <FooterTemplate>
                                </td> </tr> </table>
                            </FooterTemplate>
                        </asp:Repeater>
                        <br />
                       A TextBox: <asp:TextBox ID="text" runat="server"></asp:TextBox>
                    </ContentTemplate>
                </asp:UpdatePanel>
            </div>
        </form>
    </body>
    protected int CurrentPage
            {
                get
                {
                    // look for current page in ViewState
                    object o = this.ViewState["_CurrentPage"];
                    if (o == null)
                        return 0;   // default to showing the first page
                    else
                        return (int)o;
                }
                set
                {
                    this.ViewState["_CurrentPage"] = value;
                }
            }
    
            protected int PageCount
            {
                get
                {
                    // look for current page count in ViewState
                    object o = this.ViewState["_PageCount"];
                    if (o == null)
                        return 1;   // default to just 1 page
                    else
                        return (int)o;
                }
                set
                {
                    this.ViewState["_PageCount"] = value;
                }
            }
    
            private static DataSet getData() {
                DataSet ds = new DataSet();
                string conStr = ConfigurationManager.ConnectionStrings["conStr"].ToString();
                using (SqlConnection conn = new SqlConnection(conStr)) {
                    string query = "select * from simpletb";
                    using (SqlCommand cmd = new SqlCommand(query, conn)) {
                        SqlDataAdapter sda = new SqlDataAdapter(cmd);
                        sda.Fill(ds);
                    }
                }
                return ds;
            }
    
            protected void GetItems()
            {
                PagedDataSource pagedData = new PagedDataSource();
                pagedData.AllowPaging = true;
                pagedData.PageSize = 10;
                pagedData.DataSource = getData().Tables[0].DefaultView;
                pagedData.CurrentPageIndex = CurrentPage;
    
                PageCount = pagedData.PageCount;
    
                // Wire up the page numbers
                if (pagedData.PageCount > 1)
                {
                    rptPages.Visible = true;
                    ArrayList pages = new ArrayList();
                    for (int i = 0; i < pagedData.PageCount; i++)   
                        if (i == CurrentPage)
                        {
                            pages.Add("<b>" + (i + 1).ToString() + "</b>");
                        }
                        else
                        {
                            pages.Add((i + 1).ToString());
                        }
                    rptPages.DataSource = pages;
                    rptPages.DataBind();
                }
                else
                {
                    rptPages.Visible = false;
                }
                Repeater1.DataSource = pagedData;
                Repeater1.DataBind();
            }
    
           protected void rptPages_ItemCommand(object source,RepeaterCommandEventArgs e)
            {
                CurrentPage = Convert.ToInt32(e.CommandArgument) - 1;
                GetItems();
            }
    
            protected override void OnInit(EventArgs e)
            {
                base.OnInit(e);
                rptPages.ItemCommand += new RepeaterCommandEventHandler(rptPages_ItemCommand);
            }
    
            protected override void OnLoad(EventArgs e)
            {
                base.OnLoad(e);
                GetItems();
            }

    I set up a text input box to test, and result:

    Hope this can help you.

    Best regards,

    Xudong Peng

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Friday, July 24, 2020 7:09 AM
  • User-939850651 posted

    Hi jamieP1,

    Have your problem solved?

    Thursday, August 6, 2020 8:30 AM