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 для получения дополнительной информации.