转--手把手教你写Ajax驱动的DataGrid控件(三)

转自 http://www.cnblogs.com/wfyfngu/archive/2007/10/10/918931.html

在上一篇文章,我们实现了将Object类型的数据源转化为DataTable的目的。接下来,我们就要将数据源保留下来,直到确定它们不再使用。
    保留数据源很容易,也很好实现,我们这里采用Hashtable来实现数据的缓存。但是,将数据源保留到什么时候呢?怎样才能准确判断数据源不再被使用?我们稍后讨论。
    1.1 保留数据源 AjaxGridHelper.cs
using  System;
using  System.Collections;

namespace  Wfyfngu.Web.UI
{

    
///   <summary>
    
///  AjaxGridHelper 的摘要说明。
    
///   </summary>
    [Serializable]
    
internal   class  AjaxGridHelper
    {
        
        
//  主表
        
//  key: 客户端唯一标识,用于区分用户
        
//  value: 辅表
        
//  --辅表
        
//  key: 控件唯一标识
        
//  value: DataGridSourceInfo对象
         private   static  Hashtable CachedSource  =   new  Hashtable( 100 );

        
//  客户列表
         private   static  Hashtable CachedClient  =   new  Hashtable( 100 );

        
///   <summary>
        
///  允许的不活动时间(分钟)
        
///  如果数据源没有被正常销毁,则在这个时间后调用相应的代码将其销毁
        
///  当客户端在这个时间之内和服务器通信则认为其在线
        
///  如果客户端在这个时间内没有和服务器通信,则删除他的所有数据
        
///   </summary>
         private   static   int  TimeOut  =   720 ;

    
}

}

    在上面的代码中,我们采用了两个哈希表,其中表CachedSource用来存贮数据源,而表CachedClient用来存贮AjaxGrid客户端的状态信息。它们具有一个随机生成的相同的GUID作为Key。加入我们在.aspx页面载入了一个AjaxGrid控件,则服务器为它分配一个唯一的GUID作为标识,这个GUID以Key的形式同时在CachedSource和CachedClient中生成一个Key-Value对,并存贮一些必要的信息。见下表:
哈希表 Key Value 说明
CachedSource b9fbb335-c2d8-4aee-bd2c-3518e7c27a3e new AjaxGridSourceInfo(...)
CachedClient b9fbb335-c2d8-4aee-bd2c-3518e7c27a3e 控件创建的时间


    下面附上AjaxGridSourceInfo.cs的源码

using  System;

namespace  Wfyfngu.Web.UI
{
    
/// <summary>
    
/// AjaxGridSourceInfo 的摘要说明。
    
/// </summary>

    [Serializable]
    
internal class AjaxGridSourceInfo
    
{
        
private string[] _Captions = null;
        
private object _DataSource;

        
/// <summary>
        
/// 
        
/// </summary>

        public AjaxGridSourceInfo() {}

        
/// <summary>
        
/// 
        
/// </summary>
        
/// <param name="captions">标题</param>
        
/// <param name="dateSource">数据源</param>

        public AjaxGridSourceInfo(string[] captions, object dateSource)
        
{
            _Captions   
= captions;
            _DataSource 
= dateSource;
        }


        
/// <summary>
        
/// 获取AjaxGrid的标题集合
        
/// </summary>

        public string[] Captions
        
{
            
get {return _Captions;}
        }


        
/// <summary>
        
/// 获取AjaxGrid用户控件的数据源
        
/// </summary>

        public object DataSource
        
{
            
get {return _DataSource;}
        }


    }

}

    至此,我们完成了数据源的保存工作,接下来讨论我们遗留下来的问题。
    1.2 数据源的销毁
    数据源要在适当的时间销毁,如果太早,当然不行;如果太晚,势必造成内存的浪费。我们提供两种机制确保不再使用的数据源可以被销毁。
        1) 由客户端通知服务器,告知指定的数据源不再使用
        2) 如果客户端没有按照预期工作(这是有可能的,因为客户端代码不可信任),我们就按事先约定清除过期的数据

>>待续!控件源码及简单介绍请登陆 http://www.codeassistant.net/wfygrid/<<

你可能感兴趣的:(datagrid)