日期:2009-10-27  浏览次数:20439 次

很久都没有写一点东西了,最近一直在学习.net,前两天看到椰子林写的一篇《ASP.NET分页组件学与用》,于是自己就跟着做了一遍,一次成功,在此向他表示感谢,也向他那种共享的精神致敬!可是后来我发觉这个组件用起来有点麻烦,在Page_Load里面不但要得到记录集,还要写SQL语句分页,最后还要自己写代码将包含数据的<table></table>输出到客户端,于是我就想呀要是可以像DataGrid那样只是简单的绑定一下就可以用就好,分页,显示数据呀这些都交给组件去完成,正是这灵光一现,我就开始冲动了,没办法程序就是有这么大的魅力!结果,我昨天晚上失眠了,哎!冲动的惩罚呀!今天早上,我带着红肿的眼睛走进了机房,开始实现我昨天晚上梦见的那个东东,幸运的是--我实现了,呵呵,一个字爽!忘了告诉大家,我还是一个学生,做出来我很高兴了,技巧谈不上,高手们看了莫怪。下面我把基本的做法说一下!

如何做自定义控件,以及如何实现分页在这里我就不多说了,大家可以看一下椰子林写的相关文章,我要说说我的做法:

首先定义一个DataSource属性,如下:

private DataTable dt; //数据源

/// <summary>
/// 数据源
/// </summary>
public DataTable DataSource
{
get
{
return dt;
}
set
{
if (value == null)
throw new Exception("数据源不可为空");
else
dt = value;
}
}
该属性用于接受前端传进来的DataTable对象。我们可以在前端使用ADO.NET获得数据并将数据填充到一个DataTable中,再将此包含数据的DataTable赋于组件的DataSource属性,接下来的工作就是由组件向客户端输出包含数据的<table></table>标签了,怎么样简单吧!其实没有做多少改进,只是简单的扩展了一下,如下:

/// <summary>
/// 创建数据表
/// </summary>
/// <returns>表格的HTML表示字符串</returns>
protected string CreateDataTable()
{
string table = null; //表格,显示了所有的字段和记录
string tableHead = null; // 表头用于显示字段名的<tr>
string tdHead = null; // 表头用于显示字段名的<td>包含在tableHead中
string tableBody = null; // 表主体用于显示记录的<tr>

// 为了实现分页定义min和max两个变量
// min代表从那一条记录开始显示
// max代表到那一条记录结束
// 如果当前是第2页每页显示10条记录的话,那么min的值就是10,max的值就是20
int min = 0;
int max = 0;

// for循环用于产生表头,即字段名
for (int i = 0; i < this.dt.Columns.Count; i++)
{
tdHead = tdHead + "<td>" + this.dt.Columns[i].ColumnName + "</td>";
}

// 判断当前页是否最后一页
if (this.currentpage == this.PageCount)
{
min = (this.currentpage - 1) * this.count;
max = this.dt.Rows.Count;
}
else
{
min = (this.currentpage - 1) * this.count;
max = this.currentpage * this.count;
}

// for循环用于产生表主体,即提取记录
for (int j = min; j < max; j++)
{
tableBody = tableBody + "<tr bgcolor='#FFFFFF'>";

for (int k = 0; k < this.dt.Columns.Count; k++)
{
tableBody = tableBody + "<td>" + this.dt.Rows[j][k].ToString() + "</td>";
}

tableBody = tableBody + "</tr>";
}

tableHead = "<tr bgcolor='#FFFFFF'>" + tdHead + "</tr>";

table = "<table border='0' cellpadding='0' cellspacing='1' width='100%' height='100%' bgcolor='#000000' style='font-size:9pt'>" + tableHead + tableBody + "</table>";

return table;
}

这样就得到了包含数据的表格的HTML字符串,跟着就是做分页部分,最后重写Render(HTMLTextWriter output)方法将整个组件输出到客户端!这里我不一一详述步骤,我把代码帖出来,有兴趣的可以将代码拷贝到本机上运行一下!

组件源代码如下:(调试通过)

public class MyDataGrid : System.Web.UI.WebControls.WebControl
{
private int currentpage; //当前页
private int count; //每页显示的记录条数
private int navigcount; //导航连接的个数
private DataTable dt; //数据源

private const string SCRIPTSTRING = "<script language='javascript'>\n" +
" function go(ctrl,max)\n" +
"{\n" +
"if(ctrl.value >= 1 && ctrl.value <= max)\n" +
"{\n" +
"var url;\n" +
"var index;\n" +
"url = location.href;\n" +
"index = url.indexOf('?');\n&quo