有没有办法实现页面局部的延迟加载

解决方案 »

  1.   

    一、在界面第一次显示时加载
    最简单的延迟加载可以通过控件第一次显示时加载数据,例如你有很多的页签,只有用户切换到这个页签时,才会加载数据。
    在.NET的Control中提供SetVisibleCore虚方法,当检测value是true且第一次调用此方法时,调用延迟加载。但是我并不推荐这个方法,因为你有更好的地方。
    - 如果你的控件继承自Form或者UserControl,建议重载OnLoad;
    - 如果继承自Control,可以重载OnCreateControl。
    下面是延迟加载数据的例子:
    public class MyTabPage : TabPage {
    protected override void OnCreateControl() {
    base.OnCreateControl();string oldText = this.Text;
    this.Text = "Loading..";//TODO:在这里调用加载数据的方法this.Text = oldText;
    }
    }
    二、树控件在第一次展开时加载
    TreeView因为所有的节点并不是继承自Control,所以不能使用上面的方式,但是TreeView提供了OnBeforeExpand虚方法,最简单的办法是在你打算实现延迟加载的节点加入一个是否已经加载的标记,当第一次展开时,检测这个标记。
    必须记住你的延迟加载节点在根位置是不能收到这个事件的。三、在表格中延迟加载。
    在Windows程序中,有的使用分页的方式实现延迟加载,但这种方式的用户体验非常的糟糕。如果你希望仍然使用滚动条的话,可以自己实现IBindList接口,内部持有一个数据的ID列表,在表格询问数据时,才到数据库加载数据,通常的表格控件都能够很好的工作。
    但这里有个应该注意的地方,例如用户按下PageDown时,表格控件连续的调用获取数据方法,如果每次请求都去调用数据库,将会很低的性能,应该让你的程序“预知”到可能要读下50笔数据了,所以一次性多读50条就可以。
    这种方法遇到表格排序的时候就没有办法了。
      

  2.   

    在你需要“延迟加载”的地方,首先设置它的Visible为False,然后在页面上放置一个或者多个 UpdatePanel(显示控件放在其中或者关联到他),每一个中内嵌一个Timer控件并且设置为100毫秒,在Timer的事件中才更新相应的页面局部控件的Visible属性。
      

  3.   

    这里是这个例子:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>无标题页</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:ScriptManager ID="ScriptManager1" runat="server">
            </asp:ScriptManager>
            <br />
            <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Timer ID="Timer1" runat="server" Interval="100" ontick="Timer1_Tick">
                    </asp:Timer>
                    <asp:Image ID="Image1" runat="server" 
                        ImageUrl="http://www.cnu.cc/bbs/attachments/month_0809/20080912_8963470dde36bd32d2aeYAShubq6D0HO.jpg" 
                        Visible="False" />
                </ContentTemplate>
            </asp:UpdatePanel>
            <br />
            这里测试延迟加载图片。</div>
        </form>
    </body>
    </html>
    using System;public partial class Default2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }    protected void Timer1_Tick(object sender, EventArgs e)
        {
            this.Image1.Visible = true;
            this.Timer1.Enabled = false;
        }
    }
      

  4.   

    由于你设置控件的Visible为false,那么它根本不会生成html输出到客户端。当在asp.net ajax方法中设置它的Visible为true,它就被在客户端插入。这就实现了在页面其它内容装载显示之后再加载。这样的大页面看起来显示的非常快,其实并没有加快,只是用户感觉起来很快。
      

  5.   

    实际上,我是觉得你可以大量使用延迟加载技术。如果一个GridView的数据需要较长时间统计才得到,那么你也可以在设计时先把他的Enabled属性设置为false同时设置Visible为false,然后再延迟加载(此时才设置Enabled为true)。
      

  6.   

    哦对了,我应该说明一下,其实对于简单图片并没必要这样加载,我只是脑筋一短路(觉得图片看起来很明显并且编程最简单)就用这个了。对于图片,理论上ie会多线程下载。但是,当你的图片是放在table内部(因此他会阻碍table整体的快速显示),或者你需要经常动态切换广告画,你才需要使用ajax方式加载图片。我举这个例子的目的是针对几乎“任何asp.net组件”而言的,例如对于页面上一些现实统计信息的GridView报表,你无法使用传统的那种通过javascript简单写ajax代码来加载它,但是使用asp.net ajax则可以。