我有一个包含多列的gridview,但只有一列应该动态更改。每行都有一个“status”值,我需要进行数据库调用才能更新。我已经编写了一个函数来执行该调用,但是我为更新它而编写的当前方法刷新了整个页面。这是突兀的,因为刷新会删除状态(页面其他区域中的选定值,滚动位置等)。
以下是我试图设置的代码:
<div class = "my_gridview">
<asp:Timer ID = "timer_1" OnTick = "timer_1Tick" runat = "server" Interval = "25" />
<asp:UpdatePanel ID = "update_panel" UpdateMode = "Conditional" runat = "server">
<Triggers>
<asp:AsyncPostBackTrigger ControlID = "timer_1" EventName = "Tick" />
</Triggers>
<ContentTemplate>
<asp:GridView ID="my_gridview" runat="server" AutoGenerateColumns = "False"
GridLines="None" Width="100%" AllowSorting="True"
CssClass="table table-bordered x-condensed cameraDetails" OnRowDataBound = "my_list_RowDataBound"
EmptyDataText = "There are no generated heatmaps">
<Columns>
<asp:TemplateField meta:resourceKey = "StringSourceID">
<HeaderTemplate>
<asp:Label ID = "srcTitleLbl" runat="server" Text = "Source" />
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID = "srcLbl" runat="server" CssClass="LinkBtn_Type" meta:resourceKey="srcLblResource" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField meta:resourceKey = "StringStatus">
<HeaderTemplate>
<asp:Label ID = "statusTitleLbl" runat="server" Text = "Status" />
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID = "statusLbl" runat="server" CssClass="LinkBtn_Type" meta:resourceKey="statusLblResource" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
如果不刷新整个页面,怎么办呢?
答案 0 :(得分:2)
UpdatePanels执行部分回发,但仍然会经历页面生命周期,这会导致删除状态。您可以调查项目选择(复选框,行等)之类的持久性内容,但您很可能会花费大量时间来创建它并保持它将是一场噩梦。
要真正避免页面生命周期并实现您所描述的用户体验,请使用客户端解决方案,如纯JavaScript,KnockoutJS,Backbone或AngularJS。这些方法会在向服务器发送/检索数据时单独保留页面状态,然后可能会更新页面的部分内容。