Container.RetrieveItems() 调用一个需要一段时间的服务,所以我想异步调用它(在检索到项目后,它们被设置为 Container 类的 List 属性)。完成检索项目后,我希望它更新 updatePanel 内的 gridView(updatePanel Mode="Conditional" 和 ScriptManager EnablePartialRendering="true"。UpdatePanel 没有触发项目)。
我已经设置了断点并逐步完成了每一步。检索项目,网格是数据绑定然后它调用更新。没有抛出异常,但网格没有随内容更新。如果我将 UpdatePanel 设置为使用触发器和 Timer.OnTick 事件进行更新,它可以完美运行,但是我只需要在检索项目后更新它,因此在服务调用完成后触发手动 UpdatePanel.Update() 将是理想的。
我做了很多搜索,但所有的答案都是“你忘了调用 DataBind()”
有什么我想念的吗?
private void UpdateGrid()
{
grid.DataSource = Container.List;
grid.DataBind();
updatePanel.Update();
}
protected void Page_Load(object sender, EventArgs e)
{
var task = Task.Factory.StartNew(Container.RetrieveItems);
task.ContinueWith((x) => UpdateGrid());
}
更新: 我设置了一个更简单的测试来尝试识别问题。我创建了一个标签,其 Text 属性将在方法完成后更新。当页面加载时,它调用该方法,当方法完成时它调用 updatePanel.Update() 但没有变化。
根据 Jaimes 的建议,然后我尝试在 Button_click 的回发中调用手动更新,它确实更新了标签。这就是为什么我当前的设置不起作用的原因,尽管我仍在寻找在完成异步任务时更新内容的最佳方法。