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();
    }

СПАСИБО


person leoinlios    schedule 30.11.2012    source источник
comment
попробуйте UpdatePanel1.Update (); в btnRefresh1_Click () после привязки вашего gridview, поскольку ваш updatepanel UpdateMode является Conditional.   -  person Ashwini Verma    schedule 30.11.2012
comment
Ашвини, мой вопрос касается НЕ использования кода для обновления сетки в UpdatePanel; У меня нет проблем с обновлением сетки с помощью кода, то есть с вызовом его метода DataBind. Но все равно спасибо.   -  person leoinlios    schedule 30.11.2012


Ответы (3)


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

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

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

person VinayC    schedule 30.11.2012
comment
Спасибо. Когда вы говорите, что представление сетки не будет снова требовать данные из источника данных при обратной передаче, тогда почему сетка автоматически заполняется при загрузке страницы без необходимости явно вызывать ее метод DataBind? Почему мне нужно вызывать этот метод для нового обновления, но не для первого обновления? - person leoinlios; 30.11.2012
comment
@leoinlios, когда страница загружается в первый раз, DataBind будет вызываться автоматически - см. документацию для DataBind, цитата из документа: [[Метод DataBind вызывается автоматически, если свойство DataSourceID элемента управления GridView относится к допустимому элементу управления источником данных.] ]. В сценарии обратной передачи данные загружаются из состояния просмотра ‹b› ‹/b›. - person VinayC; 03.12.2012

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

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

Дополнительную информацию см. В MSDN.

person ScottM    schedule 17.09.2013

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

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

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

person Fandango68    schedule 06.03.2016