在方法完成执行时显示等待进度条
本文关键字:等待 显示 方法 执行 | 更新日期: 2023-09-27 18:06:57
我有一个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标签。
我会将需要时间加载的代码放在更新面板中,这样您就可以异步加载页面-首先加载静态内容,然后当生成动态部分时,它们也会加载。你甚至可以在等待加载时放置一些旋转图标,在更新面板上使用一些ready处理程序来在加载时关闭它。
按照建议,您可以使用UpdatePanel
控件。在里面,你需要设置UpdateProgress
,并在那里添加一些旋转图标:
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<!-- Your controls here -->
<updateprogress>
<progresstemplate>
<img src="images/loading.gif">
</progresstemplate>
</updateprogress>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger />
</Triggers>
首先,BackgroundWorker
类不是为在ASP环境中使用而设计的,并且不会帮助您。你最好不要用它。
您需要做的是首先创建一个新线程来异步处理。(您可能最好在这里只使用Thread
类;线程池线程不太可能有帮助,并且Thread
之上构建的其他工具(如后台工作器,Task等)都没有真正帮助这一点。然后,您需要让正在工作的线程在Session
中存储有关当前进度的一些信息,或者以其他形式的持久状态(数据库或其他外部存储是另一种选择)。最后,您需要在页面上有客户端代码(即javascript),这些代码不断轮询服务器,检查持久存储的进度,并相应地更新客户端。对于服务器来说,这是非常低效的,并且需要花费相当多的时间来开发。
下面是MSDN上的一个示例。
谢谢大家。我找到了一个简单的解决办法。
<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;");
}