0

我有一个具有数据网格的 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

4 回答 4

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;");
    }
于 2013-04-02T15:43:56.637 回答
0

首先,BackgroundWorker该类不是为在 ASP 环境中使用而设计的,因此不会对您有所帮助。你最好根本不使用它。

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

您需要做的是首先创建一个新线程来异步执行处理。(您可能最好只使用Thread这里的类;线程池线程不太可能有帮助,并且在此基础上构建的其他工具(Thread例如后台工作程序、任务等)根本没有真正帮助.) 然后你需要让正在工作的线程存储一些关于当前进度的信息Session,或者以某种其他形式的持久状态(数据库或其他外部存储是另一种选择。最后,你需要有客户端代码(意思是javascript)在不断轮询服务器的页面上,检查持久存储的进度,并相应地更新客户端。这都是高度服务器效率低下,并且需要相当多的时间来开发。

是此方法的 MSDN 上的示例。

于 2013-04-02T15:01:48.410 回答
0

我会将需要时间加载的代码放在更新面板中,以便您可以异步加载页面 - 首先是静态内容,然后在生成动态部分时,它们也会加载。您甚至可以在等待加载时放置某种旋转图标,使用更新面板上的某种就绪处理程序在加载时将其关闭。

于 2013-04-02T14:44:30.373 回答
0

如建议的那样,您可以使用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>

于 2013-04-02T14:56:56.687 回答