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

时间:2013-04-02 14:14:17

标签: c# asp.net

我有一个拥有数据网格的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标签。

4 个答案:

答案 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;");
    }