Answered by:
Repeater causes whole page to reload inside update panel

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> </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> </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