手把手教你写Ajax驱动的DataGrid控件(三)
手把手教你写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) 如果客户端没有按照预期工作(这是有可能的,因为客户端代码不可信任),我们就按事先约定清除过期的数据