我有一个拥有数据网格的ASP.NET网页。数据网格加载按钮单击事件。在加载数据网格之前,有一些方法执行,并且需要一些时间来获取数据。我想在网格加载之前显示一个进度条给用户一个等待指示器。这样做的最佳方式是什么?
protected void btnStart_Click(object sender, ImageClickEventArgs e) {
_bw = new BackgroundWorker();
_bw.DoWork += bw_DoWork;
_bw.RunWorkerCompleted += bw_RunWorkerCompleted;
_bw.RunWorkerAsync();
waiting.Style["display"] = "inline";
divDataGrid.Style["display"] = "none";
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
int n = Convert.ToInt32(e.Argument);
e.Result = PerformBinding(n, worker, e);
}
private bool PerformBinding(int n, BackgroundWorker worker, DoWorkEventArgs e)
{
Service.Start();
BindDataGrid();
return true;
}
private void BindDataGrid()
{
//take some time to get data
}
private void bw_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
waiting.Style["display"] = "none";
divDataGrid.Style["display"] = "inline";
}
这里“waiting”是等待进度条的div标签id,“divDataGrid”是包含该网格的div标签。
答案 0 :(得分:0)
我会将需要时间的代码加载到更新面板中,以便您可以异步加载页面 - 首先是静态内容,然后在生成动态部分时,它们也会加载。您甚至可以在等待加载时放置某种旋转图标,使用更新面板上的某种就绪处理程序在加载时将其关闭。
答案 1 :(得分:0)
根据建议,您可以使用UpdatePanel
控件。在其中,您需要设置UpdateProgress
并在其中添加一些spinning icon:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<!-- Your controls here -->
<updateprogress>
<progresstemplate>
<img src="images/loading.gif">
</progresstemplate>
</updateprogress>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger />
</Triggers>
答案 2 :(得分:0)
首先,BackgroundWorker
类并非设计用于ASP环境,并且不会对您有所帮助。你最好不要使用它。
在ASP中创建此行为比在桌面应用程序中更难 。这是因为您在客户端和服务器之间没有正确的双向通信。在HTTP中,客户端发出请求,并获得一个响应。服务器不能只是随意地向客户端发送数据(如果这样做,它最终会被忽略)。
您需要做的是首先创建一个新线程以异步方式进行处理。 (你最好只在这里使用Thread
类;线程池线程不太可能有用,而且没有构建在Thread
之上的其他工具,例如后台工作者,任务等真的对此有所帮助。)然后你需要让线程做工作存储一些关于Session
当前进展的信息,或者某种其他形式的持久状态(数据库或其他外部)存储是另一种选择。最后,你需要在页面上有客户端代码(意思是javascript),不断轮询服务器,检查持久存储的进度,并相应地更新客户端。这是高度服务器效率低下,开发需要相当长的时间。
Here是此方法的MSDN示例。
答案 3 :(得分:0)
全部谢谢。我找到了简单的解决方案。
<asp:ImageButton ID="btnStart" runat="server" src="images/Play.png" OnClick="btnStart_Click" OnClientClick="document.getElementById('waiting').style.display='block';" />
<div id="waiting" style="position: left: 0px; top: 0px; background-color: white;
height: 100%; width: 100%; display:none" align="center" runat="server" >
<img src="images/progress.gif" height="60px" />
</div>
protected void btnStart_Click(object sender, ImageClickEventArgs e)
{
Service.Start();
BindDataGrid();
waiting.Style.Add("display", "none;");
}