【发布时间】:2016-02-23 03:52:09
【问题描述】:
背景: 尽量避免完全回发并使用部分回发来刷新数据网格。我检查了 MSDN,堆栈溢出并尝试了控制值的不同组合来触发回发,但没有运气。
代码
<asp:ScriptManager ID="sm1" runat="server" EnablePartialRendering="true" />
<div>
<asp:UpdatePanel ID="upTest" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true" >
<ContentTemplate>
<asp:GridView ID="gvTest" runat="server" Visible="true" ShowHeader="true" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<div>Document Type</div>
</HeaderTemplate>
<ItemTemplate>
<asp:Label ID="txtDescription" Style="margin: 2px" MaxLength="254" Text='<%# Bind("DocName") %>' runat="server" Width="200px" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<br />
<label>
<AjaxControlToolkit:AsyncFileUpload ID="AsyncFileUpload1" Width="400px" runat="server"
OnUploadedComplete="AsyncFileUpload1_UploadedComplete" />
</label>
<label id="lblStatus"></label>
</ContentTemplate>
</asp:UpdatePanel>
</div>
背后的代码
if (AsyncFileUpload1.HasFile)
{
string strPath = MapPath("~/Uploads/") + Path.GetFileName(e.filename);
AsyncFileUpload1.SaveAs(strPath);
SetGridData(1);
upTest.Update();
}
private void SetGridData(int count)
{
List<Document> Documents = new List<Document>();
Document doc = new Document();
doc.DocName = "test doc";
for (int i = 0; i < count; i++)
{
Documents.Add(doc);
}
gvTest.DataSource = Documents;
gvTest.DataBind();
}
在 Page_Load 时,网格加载了 5 个数据行,在异步回发时,网格被重置为一个数据行。在查看 chrome 调试器时,我可以看到网格数据来自服务器的 Page_Load(5 行)和异步加载(1 个数据行)。但是数据网格没有刷新。在异步回发期间,我确实调用了 grid.DataBind()。任何人有任何想法发生了什么?我错过了什么吗?
注意:一切都适用于普通的 ASP.Net 控件,只是不要使用 AJAX 文件上传控件
【问题讨论】:
-
我确实在异步回发时调用了 Databind,是的,我尝试将更新模式设置为“始终”并设置异步回发触发器属性。在我分享的上述代码中,我没有使用这种方法。但我试过了。
标签: c# asp.net asp.net-ajax updatepanel aspxgridview