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

来源:岁月联盟 编辑:exp 时间:2007-10-11

  手把手教你写Ajax驱动的DataGrid控件(三),在上一篇文章,我们实现了将Object类型的数据源转化为DataTable的目的。接下来,我们就要将数据源保留下来,直到确定它们不再使用。

  保留数据源很容易,也很好实现,我们这里采用Hashtable来实现数据的缓存。但是,将数据源保留到什么时候呢?怎样才能准确判断数据源不再被使用?我们稍后讨论。

  1.1 保留数据源 AjaxGridHelper.cs

using System;
  using System.Collections;
  namespace Wfyfngu.Web.UI
  {
  /// 
  /// AjaxGridHelper 的摘要说明。
  /// 
  [Serializable]
  internal class AjaxGridHelper
  {
  // 主表
  // key: 客户端唯一标识,用于区分用户
  // value: 辅表
  // --辅表
  // key: 控件唯一标识
  // value: DataGridSourceInfo对象
  private static Hashtable CachedSource = new Hashtable(100);
  // 客户列表
  private static Hashtable CachedClient = new Hashtable(100);
  /// 
  /// 允许的不活动时间(分钟)
  /// 如果数据源没有被正常销毁,则在这个时间后调用相应的代码将其销毁
  /// 当客户端在这个时间之内和服务器通信则认为其在线
  /// 如果客户端在这个时间内没有和服务器通信,则删除他的所有数据
  /// 
  private static int TimeOut = 720;
  
  }
  }

 

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

  哈希表KeyValue说明

CachedSourceb9fbb335-c2d8-4aee-bd2c-3518e7c27a3enew AjaxGridSourceInfo(...)
  CachedClientb9fbb335-c2d8-4aee-bd2c-3518e7c27a3e控件创建的时间

 

  下面附上AjaxGridSourceInfo.cs的源码

  using System;
  
  namespace Wfyfngu.Web.UI
  {
   /**//// 
   /// AjaxGridSourceInfo 的摘要说明。
   /// 
   [Serializable]
   internal class AjaxGridSourceInfo
   {
   private string[] _Captions = null;
   private object _DataSource;
  
   /**//// 
   ///
   /// 
   public AjaxGridSourceInfo() {}
  
   /**//// 
   ///
   /// 
   /// 标题
   /// 数据源
   public AjaxGridSourceInfo(string[] captions, object dateSource)
   {
   _Captions = captions;
   _DataSource = dateSource;
   }
  
   /**//// 
   /// 获取AjaxGrid的标题集合
   /// 
   public string[] Captions
   {
   get {return _Captions;}
   }
  
   /**//// 
   /// 获取AjaxGrid用户控件的数据源
   /// 
   public object DataSource
   {
   get {return _DataSource;}
   }
  
   }
  }

 

  至此,我们完成了数据源的保存工作,接下来讨论我们遗留下来的问题。

  1.2 数据源的销毁

  数据源要在适当的时间销毁,如果太早,当然不行;如果太晚,势必造成内存的浪费。我们提供两种机制确保不再使用的数据源可以被销毁。

  1) 由客户端通知服务器,告知指定的数据源不再使用

  2) 如果客户端没有按照预期工作(这是有可能的,因为客户端代码不可信任),我们就按事先约定清除过期的数据