GridView внутри UpdatePanel не обновляется без вызова кода позади

Я новичок в ASP.Net, и я не понимаю, как работает элемент управления GridView внутри UpdatePanel.

Я прочитал здесь документацию, в которой говорится: "По умолчанию любой элемент управления обратной передачей внутри элемента управления UpdatePanel вызывает асинхронную обратную передачу и обновляет содержимое панели". тем не менее, когда я помещаю GridView и элемент управления Button внутри элемента, если у кнопки нет определенного события OnClick для выполнения grid1.DataBind();, сетка НЕ ​​будет обновлять свои данные. Кроме того, я попытался, указав AsyncPostBackTrigger на UpdatePanel для кнопки, но снова я получил то же поведение. Теперь я заметил, что UpdatePanel обновляется, когда я нажимаю кнопку без события OnClick, однако GridView внутри этого не делает. Пожалуйста, вы можете пролить свет на это? Должен ли я всегда иметь этот вызов кода, чтобы явно обновить его?

Моя строка подключения в 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>

Мой 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>

Мой код позади для btnRefresh1

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

БЛАГОДАРЮ ВАС

3 ответа

Решение

В коде панели обновлений нет ничего плохого - проблема в том, что просмотр сетки не будет запрашивать данные снова из источника данных после обратной передачи. Скорее, он будет использовать view-state для загрузки соответствующих данных.

Тем не менее, позвоните DataBind вынудит grid-view снова получать данные из источника данных, тем самым обновляя их (или вы можете попробовать отключить состояние view для grid-представления) - см. документацию по методу - комментарии в примере кода говорят то же самое.

В случае, если вы не хотите добавлять DataBind позвоните в кнопку обновления, вы можете сделать то же самое в Page_Load - тем самым обновляя сетку на каждом постбеке (независимо от элемента управления, который его вызвал).

Или позвольте ScriptManager сделать все это за вас в одной строке кода!

ScriptManager.GetCurrent(this).RegisterPostBackControl(ButtonSubmit);

Замените ButtonSubmit своим собственным элементом управления.

Используйте.DataBind() в скрипте для вашего вида сетки (то есть gridview1.DataBind();). Это просто привязывает данные к виду сетки, который уже был установлен в вашем источнике данных.

<asp:GridView ID="grid1" runat="server" DataSourceID="SQLDevelopment" AutoGenerateColumns="False">

Смотрите MSDN для получения дополнительной информации.

Другие вопросы по тегам