在方法完成执行时显示等待进度条

本文关键字:等待 显示 方法 执行 | 更新日期: 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环境中使用而设计的,并且不会帮助您。你最好不要用它。

在ASP中创建此行为比在桌面应用程序中创建要困难得多。这是因为在客户机和服务器之间没有适当的双向通信。在HTTP中,客户端发出请求并获得一个响应。服务器不能随意地向客户端发送数据(如果它这样做,它最终会被忽略)。

您需要做的是首先创建一个新线程来异步处理。(您可能最好在这里只使用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;");
    }