GridView inside UpdatePanel not refreshing without a call to code behind

leoinlios picture leoinlios · Nov 30, 2012 · Viewed 21.8k times · Source

I am new to ASP.Net and I am confused about the way a GridView control works inside an UpdatePanel.

I have read the documentation here which states "By default, any postback control inside an UpdatePanel control causes an asynchronous postback and refreshes the panel's content." yet, when I place a GridView and a Button control inside the element, unless the button has a defined OnClick event to do grid1.DataBind();, the grid will NOT refresh its data. Also, I have tried by specifying an AsyncPostBackTrigger on the UpdatePanel for the Button, but again I got the same behaviour. Now, I noticed that the UpdatePanel DOES refresh when I press a Button without OnClick event, however the GridView inside it does not. Please can you shed some light on this? Must I always have that call to code behind to explicitly refresh it?

My connection string in Web.Config

    <connectionStrings>
        <add name="myConnectionString"
             connectionString="Data Source=XXXXX;Initial Catalog=XXXX;Persist Security Info=True;User ID=XXXXX;Password=XXXXX"
             providerName="System.Data.SqlClient" />
    </connectionStrings>

My Default.aspx

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="EmptyWebApp.Default" %>
 <!DOCTYPE html>
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server"> <title></title> </head>
 <body>
     <form id="form1" runat="server">
         <div>
             <asp:ScriptManager ID="ScriptManager" runat="server" EnablePartialRendering="true" />
             <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                 <ContentTemplate>
                     <asp:GridView ID="grid1" runat="server" DataSourceID="SQLDevelopment" AutoGenerateColumns="False">
                         <Columns>
                             <asp:BoundField DataField="UserID" HeaderText="UserID" SortExpression="UserID" />
                             <asp:BoundField DataField="Date" HeaderText="Date" SortExpression="Date" />
                         </Columns>
                     </asp:GridView>
                     <asp:SqlDataSource ID="SQLDevelopment" runat="server"
                    ConnectionString="<%$ ConnectionStrings:myConnectionString %>" 
                    SelectCommand="SELECT * FROM [TestTableA]"></asp:SqlDataSource>
                <%=DateTime.Now.ToString()%> <br />
                <asp:Button ID="btnRefresh" runat="server" Text="Refresh without C# event"/>
                <asp:Button ID="btnRefresh1" runat="server" Text="Refresh with C# event" OnClick="btnRefresh1_Click"/>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
 </form></body><html>

My Code behind for btnRefresh1

    protected void btnRefresh1_Click(object sender, EventArgs e)
    {
        grid1.DataBind();
    }

THANK YOU

Answer

VinayC picture VinayC · Nov 30, 2012

There is nothing wrong with update-panel code - issue is that grid-view will not demand the data again from data-source on post-back. Rather, it will use view-state to load the corresponding data.

However, call to DataBind will force grid-view to get the data from data source again thereby refreshing it (or you may try disabling the view-state for grid view) - see documentation for the method - comments within example code says the same.

In case, you do not want to add DataBind call in refresh button, you can do the same in Page_Load - thereby refreshing the grid on every post-back (regardless the control that has caused it).