一个web页面上有一个搜索框和一个搜索按钮,有6个GridView控件,输入一个关键字点击搜索后,页面会执行6次SQL数据库查询,因为每张表的结构和内容不同,6次查询完成可能需要1分钟左右,为了有更好的用户体验和防止页面超时,在查询期间页面上的6个GridView控件显示正在查询,然后依次填充结果,也就是说,那6次查询是依次进行的,每进行完毕一个就在页面上填充一个GridView控件,没有查询的就显示正在查询,在此期间页面是无刷新的状态。
UpdatePanel控件根本做不到,UpdatePanel 控件添加到页面上的效果是,后台的6次查询全部完成后才刷新页面,我要的效果是,查询完成一个,页面就显示一个查询结果。谁能帮帮忙?给点思路,最好有示例代码。我都不知道这些效果到底涉及到什么技术

解决方案 »

  1.   

    可是我只在页面上设置一个TextBox和一个Button啊
    照1楼说的,那岂不是要每个GridView控件都单独设置一个Button
      

  2.   

    UpdatePanel好像很麻烦,即使用update用jquery的多个ajax试试
    <form id="form1" runat="server">
        <div id="a1">
        </div>
        <div id="a1_1">
        </div>
        <br />
        <div id="a2">
        </div>
        <div id="a2_1">
        </div>
        <script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
        <script>
            $.ajax({
                type: "GET",
                url: "Handler.ashx",
                cache: false,
                data: "key=1",
                beforeSend: function(){ $("#a1_1").html("载入"); },
                success: function (msg) {
                    $("#a1_1").html(""); 
                    $("#a1").html(msg);
                }
            });
            $.ajax({
                type: "GET",
                url: "Handler2.ashx",
                cache: false,
                data: "key=1",
                beforeSend: function () { $("#a2_1").html("载入"); },
                success: function (msg) {
                    $("#a2_1").html("");
                    $("#a2").html(msg);
                }
            });
        </script>
        </form>
    Handler.ashx
    <%@ WebHandler Language="C#" Class="Handler" %>using System;
    using System.Web;public class Handler : IHttpHandler {
        
        public void ProcessRequest (HttpContext context) {
            context.Response.ContentType = "text/plain";
            System.Threading.Thread.Sleep(5000);
            context.Response.Write("Hello World");
        }
     
        public bool IsReusable {
            get {
                return false;
            }
        }}
    Handler2.ashx<%@ WebHandler Language="C#" Class="Handler2" %>using System;
    using System.Web;public class Handler2 : IHttpHandler {
        
        public void ProcessRequest (HttpContext context) {
            context.Response.ContentType = "text/plain";
            System.Threading.Thread.Sleep(1000);
            context.Response.Write("Hello World");
        }
     
        public bool IsReusable {
            get {
                return false;
            }
        }}
      

  3.   

    UpdatePanel不是正是用来异步加载的工具么?难道你在入门书上没有抄到代码,就想不到更新UpdatePanel内容的代码么?我想你还是要稍微开发一点想象力,否则光是死记硬背编程语句远远不够。随便写一个Demo好了。<%@ Page Language="C#" %><%@ Import Namespace="System.Linq" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">    protected void Timer1_Tick(object sender, EventArgs e)
        {
            UpdatePanel1.Update();
            this.Image1.Visible = true;
            if (DateTime.Now.Ticks % 2 == 0)
                this.Image1.ImageUrl = "http://avatar.profile.csdn.net/1/8/D/2_sp1234.jpg";
            else
                this.Image1.ImageUrl = "http://imgsrc.soso.com/imgget.q?id=e422d6d9a9c9b462a61b5e9d37105d87";
        }    protected void Timer2_Tick(object sender, EventArgs e)
        {
            UpdatePanel2.Update();
            this.Calendar1.SelectedDate = new DateTime(2010, 10, 1);
            this.Calendar1.Visible = true;
            Timer2.Enabled = false;
        }    protected void Timer3_Tick(object sender, EventArgs e)
        {
            UpdatePanel3.Update();
            Timer3.Enabled = false;
            var dic = this.Request.ServerVariables;
            GridView1.DataSource = (from k in dic.AllKeys
                                    select new { Name = k, Value = dic[k] }).ToList();
            GridView1.DataBind();
            GridView1.Visible = true;
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>异步加载页面上的html片段</title>
    </head>
    <body style="margin: 0; padding: 0; overflow: auto">
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <table border="0" cellspacing="0" cellpadding="0">
            <tr>
                <td valign="top">
                    这里有一些异步加载的内容,它们的刷新频率各不相同!
                    <br />
                    <br />
                    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                        <ContentTemplate>
                            <asp:Timer ID="Timer1" runat="server" Interval="5000" OnTick="Timer1_Tick" />
                            <asp:Image ID="Image1" runat="server" ImageUrl="http://imgsrc.soso.com/imgget.q?id=e422d6d9a9c9b462a61b5e9d37105d87"
                                Visible="false" />
                        </ContentTemplate>
                    </asp:UpdatePanel>
                    <hr />
                    <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
                        <ContentTemplate>
                            <asp:Timer ID="Timer2" runat="server" Interval="500" OnTick="Timer2_Tick" />
                            <asp:Calendar ID="Calendar1" runat="server"></asp:Calendar>
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </td>
                <td rowspan="2">
                    <asp:UpdatePanel ID="UpdatePanel3" runat="server" UpdateMode="Conditional">
                        <ContentTemplate>
                            <asp:Timer ID="Timer3" runat="server" Interval="2000" OnTick="Timer3_Tick" />
                            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" Visible="false" />
                        </ContentTemplate>
                    </asp:UpdatePanel>
                </td>
            </tr>
        </table>
        </form>
    </body>
    </html>
      

  4.   


    你自己想想看,谁说点击Button就应该开始查询?这是你自己的钻进牛角尖里了。既然你要异步查询显示,那么点击Button就意味着开始部署查询,也就是开始Timer.Enable=true从而让6个UpdatePanel开始各自分别并行运行,这才是Button的任务。其实用大白话就能做好软件设计。关键是说好大白话,说太多的技术术语会因为玩名词概念而钻入牛角尖里,反而不利于软件设计。
      

  5.   

    如果只是为了demo(不关注内容的话),你还可以把Timer3的事件处理方法再改得动态一点:    protected void Timer3_Tick(object sender, EventArgs e)
        {
            UpdatePanel3.Update();
            if (DateTime.Now.Ticks % 2 == 0)
            {
                var dic = this.Request.ServerVariables;
                GridView1.DataSource = (from k in dic.AllKeys
                                        select new { Name = k, Value = dic[k] }).ToList();
            }
            else
            {
                var dic = this.Request.Cookies;
                GridView1.DataSource = (from k in dic.AllKeys
                                        select new { Name = k, Value = dic[k].Value }).ToList();
            }
            GridView1.DataBind();
            GridView1.Visible = true;
        }