当前位置:编程学习 > C#/ASP.NET >>

asp.net Repeater1绑定显示大量数据时,显示"正在加载数据,请稍后"的提示

asp.net  Repeater1绑定显示大量数据时,显示"正在加载数据,请稍后"的提示 --------------------编程问答-------------------- 为什么不分页? --------------------编程问答-------------------- 在实际中我们经常遇到表里的记录数非常庞大(数万至数百万),而一次只显示几十条数据的情况,如果我们直接用下面的SQL语句查询并填充到DataTable的话,将是一个非常恐怖的事情(假设UserInfo有几百万乃至上亿用户数据):
Select * from UserInfo
初学者在使用ADO.NET时可能会犯两个错误:
(1)在显示数据时:在查询时会将所有满足条件的数据全部填充到DataTable中,然后再在程序中根据条件显示其中一部分数据。
(2)在统计数据时:在获取符合条件的记录条数时也是通过将所有满足条件的数据全部填充到DataTable中,然后通过DataTable实例的Rows.Count属性来获取记录条数。
上面的做法效率是极低的(在数据量较小并且在本机测试的时候效果不太明显),如果数据库中存在的数据量太大,很可能造成一个页面长久无法显示(笔者曾经优化过一个网站,数据库中有个表有600万条记录,开发人员就是通过上面的错误办法来处理的,经过网站首页15分钟都无法显示)。在显示数据时应该用分页查询。
分页查询就是根据需要每次只返回所需要的数据,而不用每次都从数据库中全部把数据提取出来,这样可以降低程序与数据库之间的数据传送量,并且还可以提高程序的性能。 --------------------编程问答-------------------- asp.net夜话之七:ADO.NET介绍
ADO.NET是对Microsoft ActiveX Data Objects (ADO)一个跨时代的改进,它提供了平台互用性和可伸缩的数据访问。由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。事实上,接受数据的组件不一定要是ADO .NET组件,它可以是基于一个Microsoft Visual Studio的解决方案,也可以是任何运行在其它平台上的任何应用程序。以前做数据库访问的时候,需要一直与数据库保持连接,直到获取完所有满足需要的数据之后才会断开数据库连接,这种数据库访问方式称之为连接式数据访问技术。相比于以前的连接式数据访问技术,ADO.NET除了提供连接式数据访问技术之外,还提供了另一种断开式解决方案,那就是在内存中模拟一个数据库,也就是内存中的数据库。我们知道在实际的数据库技术中,每个数据库就是一个业务逻辑单元,一般来说这个数据库包含了实现一个应用软件或者一个网站所需要的全部数据。
本篇中还讲述了自定义分页在数据库层的理论。 --------------------编程问答-------------------- 分页我就不说了,至于等待提示,可以使用iframe或ajax来做,
先载入主页面然后在这个主页面中写脚本来检测iframe或某个元素的值,当这个元素的值满足某一条件表示已加载完成.
然后去掉等待界面,显示数据. --------------------编程问答-------------------- 微软的AJAX中的UpdateProgress控件就是干这个事的!! --------------------编程问答-------------------- 前两天弄在网上找了一个很好的例子,不敢独享,特拿来和LZ分享
在HTML页加(任何地方)

<div id="divWaiting" style="display: none; z-index: 1100; left: 25%; right: 25%; position: absolute;
     text-align: center; width: 50%; height: 50px; border-right: #009900 1px solid;
     border-top: #009900 1px solid; border-left: #009900 1px solid; border-bottom: #009900 1px solid;
     background-color: #f9fff6; left: expression((this.offsetParent.clientWidth/2)-(this.clientWidth/2)+this.offsetParent.scrollLeft);
     top: expression((this.offsetParent.clientHeight/2)-(this.clientHeight/2)+this.offsetParent.scrollTop);">
    <br>
     The system is dealing with your request, please waiting
</div>
<div id="divDisable" style="display: none;width:expression(document.body.offsetWidth);height:expression(document.body.offsetHeight); z-index: 1000; position: absolute;left: 0px; top: 0px;filter:alpha(opacity=50); background-color:White"></div>

点击按钮的操作:(把下面的两句加载到按钮的JS脚本里)
document.getElementById("divWaiting").style.display="";
document.getElementById("divDisable").style.display="";
其他处理:(这个写在页面就可以了)
function ChangeDiv()
{
    document.getElementById("divDisable").style.height=document.body.offsetHeight+document.body.scrollTop;
}
window.onscroll=ChangeDiv; 
--------------------编程问答-------------------- 楼是说的UpdateProgress也不错 --------------------编程问答--------------------

<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID ="Button1" EventName ="Click" />
            </Triggers>
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdateProgress ID="UpdateProgress1" runat="server">
            <ProgressTemplate>
                <span style =" font-size:12px">数据加载中......</span>
            </ProgressTemplate>
        </asp:UpdateProgress>
        <asp:Button ID="Button1" runat="server" Text="Button" Width="143px" OnClick="Button1_Click" />
    </form>
</body>

updateprogress和updatepanel共同使用,不用对updateprogress进行任何设置,
--------------------编程问答-------------------- 如果是页面第一次显示时绑定数据源,那用UpdatePanel或UpdateProgress好像没什么用吧?

那个漫长的绑定过程是在服务器端进行的,即使用上UpdatePanel,第一次显示时还是得进行绑定。

这东西其实用Silverlight做最容易。如果用ajax实现,你也得用client端的js异步访问。。。
--------------------编程问答-------------------- Ajax的UpdateProgress
……
<asp:UpdateProgress ID="up1" runat="server">
<ProgressTemplate>正在加载数据,请稍后……</ProgressTemplate>
</UpdateProgress >
……

需要显示信息的页面LOAD事件中
if(!IsPostBack)
{
   div1.Style.Add("display","none");//假设Repeater1放在div1中
    System.Threading.Thread.Sleep(10000);//进程休息10秒
   div1.Style.Add("display","block");//假设Repeater1放在div1中
} --------------------编程问答-------------------- 楼上的都给出了,8楼也贴出代码了,很全. --------------------编程问答-------------------- mark --------------------编程问答-------------------- <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID ="Button1" EventName ="Click" />
            </Triggers>
            <ContentTemplate>
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            </ContentTemplate>
        </asp:UpdatePanel>
        <asp:UpdateProgress ID="UpdateProgress1" runat="server">
            <ProgressTemplate>
                <span style =" font-size:12px">数据更新中......</span>
            </ProgressTemplate>
        </asp:UpdateProgress>
        <asp:Button ID="Button1" runat="server" Text="Button" Width="143px" OnClick="Button1_Click" />

  <asp:updateprogress ID="UpdateProgress1" runat="server">
                <progresstemplate>
                    <span lang="zh-cn">数据正在读取中..请稍后!!!</span>
                    <input type="button" value ="取消" onclick="stop();" />
                </progresstemplate>          
            </asp:updateprogress>
--------------------编程问答-------------------- 用js 不刷新分页! --------------------编程问答-------------------- 顺便借问一下:
 那个全选按钮
 protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
    {
        for (int i = 0; i <= GridView1.Rows.Count - 1; i++)
        {
            CheckBox cbox = (CheckBox)(GridView1.Rows[i].FindControl("CheckBox1"));
            if (CheckBox2.Checked == true)
            {
                cbox.Checked = true;
            }
            else
            {
                cbox.Checked = false;
            }
        }
    }

如果分了页怎么用才只全选当前页的项呢? 慢慢想总能想出办法。但是我想知道有没有更有效的方法。谢谢! --------------------编程问答-------------------- 难道你不用分页么??
用select top分页啊 --------------------编程问答-------------------- 结贴率不是一般的低啊。 --------------------编程问答-------------------- 要支持下微软... --------------------编程问答--------------------
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,