javascript学习笔记(十一)对表格进行排序(包括数值、字符串、日期等数据类型)
在javascript学习笔记(十)中,我们对表格进行了一些美化,主要是实现隔行换色及鼠标经过时高亮两个功能!这样看起来,感觉已经不错了,用户体验要比之前好多了。
在今天的学习笔记中,我们对表格再改进一些,让用户体验再好一些。我们先看下图:

图1 会员信息表
比如我们现在有图1这样一个表格,在会员组这一列中,需要把相同会员组的排在一起,这样就需要对这个表格进行一些排序的操作。下面我们就来一步一步实现这个需求:
基本原理:首先提取会员组这列的值,然后存储在一个数组中,然后利用arrayObject.sort()方法对其排序,排序的结果先保存在一个临时的代码片段中(documentFragment),最后把新的排序结果替换掉之前的单元格,最终实现排序的功能。
javascript部分代码:
//用于sort排序的比较函数 function compareTrs(tr1, tr2) { var value1 = tr1.cells[3].innerHTML; var value2 = tr2.cells[3].innerHTML; //var value1 = tr1.cells[3].firstChild.nodeValue; //两种方式都可以取得表格中单元格的值 //var value2 = tr2.cells[3].firstChild.nodeValue; return value1.localeCompare(value2); } //对表格进行排序 function sortTable(tableId) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var tr = tbody.rows; var trValue = new Array(); for (var i=0; i<tr.length; i++ ) { trValue[i] = tr[i]; //将表格中各行的信息存储在新建的数组中 } trValue.sort(compareTrs); //进行排序 var fragment = document.createDocumentFragment(); //新建一个代码片段,用于保存排序后的结果 for (var i=0; i<trValue.length; i++ ) { fragment.appendChild(trValue[i]); } tbody.appendChild(fragment); //将排序的结果替换掉之前的值 }
然后我们在html代码中添加动作事件:
<table summary="user infomation table" id="tableSort"> <thead> <tr> <th>会员ID</th> <th>会员名</th> <th>邮箱</th> <th onclick="sortTable('tableSort')" style="cursor: pointer;">会员组</th> <th>城市</th> <th>注册时间</th> </tr> </thead> <tbody> …… </tbody> </table>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html><head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> <title>sort table -- by zhangchen</title> <style type="text/css"> * { padding:0; margin:0; } body { font-family:verdana; font-size:12px; } .content { width:550px; margin:20px auto; } .content h1 { font-family:'微软雅黑'; font-size:18px; padding-bottom:5px; } table { width:100%; } th, td { padding:6px 0; text-align:center; } th { background-color:#007D28; color:#ffffff; } tr { background-color:#E8FFE8; } .odd { background-color:#FFF3EE; } .highlight { background-color:#FFF3EE; } </style> <script type="text/javascript"> //动态给js添加class属性 function addClass(element, value) { if(!element.className) { element.className = value; //如果element本身不存在class,则直接添加class为value的值 } else { element.className += " "+value; //如果element之前有一个class值,注意中间要多一个空格,然后再加上value的值 } } //鼠标经过时高亮显示 function highlightRows() { var rows = document.getElementsByTagName("tr"); for(var i=0; i<rows.length; i++) { rows[i].oldClassName = rows[i].className; //首先保存之前的class值 rows[i].onmouseover = function() { addClass(this, "highlight"); //鼠标经过时添加class为highlight的值 } rows[i].onmouseout = function() { this.className = this.oldClassName; //鼠标离开时还原之前的class值 } } } //用于sort排序的比较函数 function compareTrs(tr1, tr2) { var value1 = tr1.cells[3].innerHTML; var value2 = tr2.cells[3].innerHTML; //var value1 = tr1.cells[3].firstChild.nodeValue; //两种方式都可以表格中单元格的值 //var value2 = tr2.cells[3].firstChild.nodeValue; return value1.localeCompare(value2); } //对表格进行排序 function sortTable(tableId) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var tr = tbody.rows; var trValue = new Array(); for (var i=0; i<tr.length; i++ ) { trValue[i] = tr[i]; //将表格中各行的信息存储在新建的数组中 } trValue.sort(compareTrs); //进行排序 var fragment = document.createDocumentFragment(); //新建一个代码片段,用于保存排序后的结果 for (var i=0; i<trValue.length; i++ ) { fragment.appendChild(trValue[i]); } tbody.appendChild(fragment); //将排序的结果替换掉之前的值 } window.onload = function() { highlightRows(); } </script> </head> <body> <div class="content"> <h1>会员信息表(点击表格标题可进行排序)</h1> <table summary="user infomation table" id="tableSort"> <thead> <tr> <th>会员ID</th> <th>会员名</th> <th>邮箱</th> <th onclick="sortTable('tableSort')" style="cursor: pointer;">会员组</th> <th>城市</th> <th>注册时间</th> </tr> </thead> <tbody> <tr> <td>126</td> <td>webw3c</td> <td>este@126.com</td> <td>普通会员</td> <td>北京</td> <td>2011-04-13</td> </tr> <tr> <td>145</td> <td>test001</td> <td>test001@126.com</td> <td>中级会员</td> <td>合肥</td> <td>2011-03-27</td> </tr> <tr> <td>116</td> <td>wuliao</td> <td>wuliao@126.com</td> <td>普通会员</td> <td>南昌</td> <td>2011-04-01</td> </tr> <tr> <td>129</td> <td>tired</td> <td>tired@126.com</td> <td>中级会员</td> <td>北京</td> <td>2011-04-06</td> </tr> <tr> <td>155</td> <td>tiredso</td> <td>tireds0@126.com</td> <td>中级会员</td> <td>武汉</td> <td>2011-04-06</td> </tr> <tr> <td>131</td> <td>javascript</td> <td>js2011@126.com</td> <td>中级会员</td> <td>武汉</td> <td>2011-04-08</td> </tr> <tr> <td>132</td> <td>jQuery</td> <td>jQuery@126.com</td> <td>高级会员</td> <td>北京</td> <td>2011-04-12</td> </tr> </tbody> </table> </div> </body> </html>
在示例1中,当我们点击表格标题中的会员组时,已经进行了排序。正是我们需要的!
但是这个还不是最好的,用户只能点击排序一次,而且是正序,如果我们要反序排呢?我们再来对sortTable()函数进行改进!
//对表格进行排序 function sortTable(tableId) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var tr = tbody.rows; var trValue = new Array(); for (var i=0; i<tr.length; i++ ) { trValue[i] = tr[i]; //将表格中各行的信息存储在新建的数组中 } if (tbody.sortCol == 3) { trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列 } else { trValue.sort(compareTrs); //进行排序 } var fragment = document.createDocumentFragment(); //新建一个代码片段,用于保存排序后的结果 for (var i=0; i<trValue.length; i++ ) { fragment.appendChild(trValue[i]); } tbody.appendChild(fragment); //将排序的结果替换掉之前的值 tbody.sortCol = 3; }
当对会员组这列首次排序后,我们再次点击表格标题中的会员组时,直接对其该列逆序排列,用户体验又加强了。
请看完整示例2:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html><head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> <title>sort table -- by zhangchen</title> <style type="text/css"> * { padding:0; margin:0; } body { font-family:verdana; font-size:12px; } .content { width:550px; margin:20px auto; } .content h1 { font-family:'微软雅黑'; font-size:18px; padding-bottom:5px; } table { width:100%; } th, td { padding:6px 0; text-align:center; } th { background-color:#007D28; color:#ffffff; } tr { background-color:#E8FFE8; } .odd { background-color:#FFF3EE; } .highlight { background-color:#FFF3EE; } </style> <script type="text/javascript"> //动态给js添加class属性 function addClass(element, value) { if(!element.className) { element.className = value; //如果element本身不存在class,则直接添加class为value的值 } else { element.className += " "+value; //如果element之前有一个class值,注意中间要多一个空格,然后再加上value的值 } } //鼠标经过时高亮显示 function highlightRows() { var rows = document.getElementsByTagName("tr"); for(var i=0; i<rows.length; i++) { rows[i].oldClassName = rows[i].className; //首先保存之前的class值 rows[i].onmouseover = function() { addClass(this, "highlight"); //鼠标经过时添加class为highlight的值 } rows[i].onmouseout = function() { this.className = this.oldClassName; //鼠标离开时还原之前的class值 } } } //用于sort排序的比较函数 function compareTrs(tr1, tr2) { var value1 = tr1.cells[3].innerHTML; var value2 = tr2.cells[3].innerHTML; //var value1 = tr1.cells[3].firstChild.nodeValue; //两种方式都可以表格中单元格的值 //var value2 = tr2.cells[3].firstChild.nodeValue; return value1.localeCompare(value2); } //对表格进行排序 function sortTable(tableId) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var tr = tbody.rows; var trValue = new Array(); for (var i=0; i<tr.length; i++ ) { trValue[i] = tr[i]; //将表格中各行的信息存储在新建的数组中 } if (tbody.sortCol == 3) { trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列 } else { trValue.sort(compareTrs); //进行排序 } var fragment = document.createDocumentFragment(); //新建一个代码片段,用于保存排序后的结果 for (var i=0; i<trValue.length; i++ ) { fragment.appendChild(trValue[i]); } tbody.appendChild(fragment); //将排序的结果替换掉之前的值 tbody.sortCol = 3; } window.onload = function() { highlightRows(); } </script> </head> <body> <div class="content"> <h1>会员信息表(点击表格标题可进行排序)</h1> <table summary="user infomation table" id="tableSort"> <thead> <tr> <th>会员ID</th> <th>会员名</th> <th>邮箱</th> <th onclick="sortTable('tableSort')" style="cursor: pointer;">会员组</th> <th>城市</th> <th>注册时间</th> </tr> </thead> <tbody> <tr> <td>126</td> <td>webw3c</td> <td>este@126.com</td> <td>普通会员</td> <td>北京</td> <td>2011-04-13</td> </tr> <tr> <td>145</td> <td>test001</td> <td>test001@126.com</td> <td>中级会员</td> <td>合肥</td> <td>2011-03-27</td> </tr> <tr> <td>116</td> <td>wuliao</td> <td>wuliao@126.com</td> <td>普通会员</td> <td>南昌</td> <td>2011-04-01</td> </tr> <tr> <td>129</td> <td>tired</td> <td>tired@126.com</td> <td>中级会员</td> <td>北京</td> <td>2011-04-06</td> </tr> <tr> <td>155</td> <td>tiredso</td> <td>tireds0@126.com</td> <td>中级会员</td> <td>武汉</td> <td>2011-04-06</td> </tr> <tr> <td>131</td> <td>javascript</td> <td>js2011@126.com</td> <td>中级会员</td> <td>武汉</td> <td>2011-04-08</td> </tr> <tr> <td>132</td> <td>jQuery</td> <td>jQuery@126.com</td> <td>高级会员</td> <td>北京</td> <td>2011-04-12</td> </tr> </tbody> </table> </div> </body> </html>
示例2中只是对指定的列进行了排序,现在我们又需要对其它的列也进行同样的排序,那怎么做呢?我们可以把需要排序的列作为一个参数给sortTable()函数。请看更改后的js:
//用于sort排序的比较函数 function compareCols(col) { //直接将compareTrs()函数作为compareCols()的返回值 return function compareTrs(tr1, tr2) { //var value1 = tr1.cells[col].innerHTML; //var value2 = tr2.cells[col].innerHTML; var value1 = tr1.cells[col].firstChild.nodeValue; //两种方式都可以取得表格中单元格的值 var value2 = tr2.cells[col].firstChild.nodeValue; return value1.localeCompare(value2); }; } //对表格进行排序 function sortTable(tableId, col) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var tr = tbody.rows; var trValue = new Array(); for (var i=0; i<tr.length; i++ ) { trValue[i] = tr[i]; //将表格中各行的信息存储在新建的数组中 } if (tbody.sortCol == col) { trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列 } else { trValue.sort(compareCols(col)); //进行排序 } var fragment = document.createDocumentFragment(); //新建一个代码片段,用于保存排序后的结果 for (var i=0; i<trValue.length; i++ ) { fragment.appendChild(trValue[i]); } tbody.appendChild(fragment); //将排序的结果替换掉之前的值 tbody.sortCol = col; }
更改后的html代码:
<table summary="user infomation table" id="tableSort"> <thead> <tr> <th>会员ID</th> <th onclick="sortTable('tableSort', 1)" style="cursor: pointer;">会员名</th> <th onclick="sortTable('tableSort', 2)" style="cursor: pointer;">邮箱</th> <th onclick="sortTable('tableSort', 3)" style="cursor: pointer;">会员组</th> <th onclick="sortTable('tableSort', 4)" style="cursor: pointer;">城市</th> <th>注册时间</th> </tr> </thead> <tbody> …… </tbody> </table>
请注意compareCols()函数,它直接将compareTrs()函数作为它的返回值,我们知道用于sort比较的函数是没有第三个参数的,所以这里将compareTrs()作为compareCols()的返回值。这样我们就可以把需要排序的列作为参数传递到sortTable()中了,这样就全部参数化了。
请看完整示例3:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html><head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> <title>sort table -- by zhangchen</title> <style type="text/css"> * { padding:0; margin:0; } body { font-family:verdana; font-size:12px; } .content { width:550px; margin:20px auto; } .content h1 { font-family:'微软雅黑'; font-size:18px; padding-bottom:5px; } table { width:100%; } th, td { padding:6px 0; text-align:center; } th { background-color:#007D28; color:#ffffff; } tr { background-color:#E8FFE8; } .odd { background-color:#FFF3EE; } .highlight { background-color:#FFF3EE; } </style> <script type="text/javascript"> //动态给js添加class属性 function addClass(element, value) { if(!element.className) { element.className = value; //如果element本身不存在class,则直接添加class为value的值 } else { element.className += " "+value; //如果element之前有一个class值,注意中间要多一个空格,然后再加上value的值 } } //鼠标经过时高亮显示 function highlightRows() { var rows = document.getElementsByTagName("tr"); for(var i=0; i<rows.length; i++) { rows[i].oldClassName = rows[i].className; //首先保存之前的class值 rows[i].onmouseover = function() { addClass(this, "highlight"); //鼠标经过时添加class为highlight的值 } rows[i].onmouseout = function() { this.className = this.oldClassName; //鼠标离开时还原之前的class值 } } } //用于sort排序的比较函数 function compareCols(col) { //直接将compareTrs()函数作为compareCols()的返回值 return function compareTrs(tr1, tr2) { //var value1 = tr1.cells[col].innerHTML; //var value2 = tr2.cells[col].innerHTML; var value1 = tr1.cells[col].firstChild.nodeValue; //两种方式都可以取得表格中单元格的值 var value2 = tr2.cells[col].firstChild.nodeValue; return value1.localeCompare(value2); }; } //对表格进行排序 function sortTable(tableId, col) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var tr = tbody.rows; var trValue = new Array(); for (var i=0; i<tr.length; i++ ) { trValue[i] = tr[i]; //将表格中各行的信息存储在新建的数组中 } if (tbody.sortCol == col) { trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列 } else { trValue.sort(compareCols(col)); //进行排序 } var fragment = document.createDocumentFragment(); //新建一个代码片段,用于保存排序后的结果 for (var i=0; i<trValue.length; i++ ) { fragment.appendChild(trValue[i]); } tbody.appendChild(fragment); //将排序的结果替换掉之前的值 tbody.sortCol = col; } window.onload = function() { highlightRows(); } </script> </head> <body> <div class="content"> <h1>会员信息表(点击表格标题可进行排序)</h1> <table summary="user infomation table" id="tableSort"> <thead> <tr> <th>会员ID</th> <th onclick="sortTable('tableSort', 1)" style="cursor: pointer;">会员名</th> <th onclick="sortTable('tableSort', 2)" style="cursor: pointer;">邮箱</th> <th onclick="sortTable('tableSort', 3)" style="cursor: pointer;">会员组</th> <th onclick="sortTable('tableSort', 4)" style="cursor: pointer;">城市</th> <th>注册时间</th> </tr> </thead> <tbody> <tr> <td>126</td> <td>webw3c</td> <td>este@126.com</td> <td>普通会员</td> <td>北京</td> <td>2011-04-13</td> </tr> <tr> <td>145</td> <td>test001</td> <td>test001@126.com</td> <td>中级会员</td> <td>合肥</td> <td>2011-03-27</td> </tr> <tr> <td>116</td> <td>wuliao</td> <td>wuliao@126.com</td> <td>普通会员</td> <td>南昌</td> <td>2011-04-01</td> </tr> <tr> <td>129</td> <td>tired</td> <td>tired@126.com</td> <td>中级会员</td> <td>北京</td> <td>2011-04-06</td> </tr> <tr> <td>155</td> <td>tiredso</td> <td>tireds0@126.com</td> <td>中级会员</td> <td>武汉</td> <td>2011-04-06</td> </tr> <tr> <td>131</td> <td>javascript</td> <td>js2011@126.com</td> <td>中级会员</td> <td>武汉</td> <td>2011-04-08</td> </tr> <tr> <td>132</td> <td>jQuery</td> <td>jQuery@126.com</td> <td>高级会员</td> <td>北京</td> <td>2011-04-12</td> </tr> </tbody> </table> </div> </body> </html>
示例3中,我们已经完成了多列的排序,但是这些仅仅只能针对字符串的列进行排序,如果现在又要按照会员ID和注册时间进行排序呢?这里我们就需要对排序函数compareCols()进行修改,在进行比较之前,我们需要对字符串按照数据类型进行转换,所以我们新增了convert()函数,请看修改后的js代码:
//比较之前进行数据转换 function convert(value, dataType) { switch(dataType) { case "int": return parseInt(value); break case "float": return parseFloat(value); break case "date": return Date.parse(value); break default: return value.toString(); } } //用于sort比较字符串 function compareCols(col, dataType) { return function compareTrs(tr1, tr2) { value1 = convert(tr1.cells[col].innerHTML, dataType); value2 = convert(tr2.cells[col].innerHTML, dataType); if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } }; } //对表格进行排序 function sortTable(tableId, col, dataType) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var tr = tbody.rows; var trValue = new Array(); for (var i=0; i<tr.length; i++ ) { trValue[i] = tr[i]; //将表格中各行的信息存储在新建的数组中 } if (tbody.sortCol == col) { trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列 } else { trValue.sort(compareCols(col, dataType)); //进行排序 } var fragment = document.createDocumentFragment(); //新建一个代码片段,用于保存排序后的结果 for (var i=0; i<trValue.length; i++ ) { fragment.appendChild(trValue[i]); } tbody.appendChild(fragment); //将排序的结果替换掉之前的值 tbody.sortCol = col; }
在html中调用:
<table summary="user infomation table" id="tableSort"> <thead> <tr> <th onclick="sortTable('tableSort', 0, 'int')" style="cursor: pointer;">会员ID</th> <th onclick="sortTable('tableSort', 1)" style="cursor: pointer;">会员名</th> <th onclick="sortTable('tableSort', 2)" style="cursor: pointer;">邮箱</th> <th onclick="sortTable('tableSort', 3)" style="cursor: pointer;">会员组</th> <th onclick="sortTable('tableSort', 4)" style="cursor: pointer;">城市</th> <th onclick="sortTable('tableSort', 5, 'date')" style="cursor: pointer;">注册时间</th> </tr> </thead> <tbody> …… </tbody> </table>
经过我们的改进,已经可以满足我们的所有需要了,我们可能对数值,日期,字符串各类型的数据进行排序了。
请看完整代码示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html><head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> <title>sort table -- by zhangchen</title> <style type="text/css"> * { padding:0; margin:0; } body { font-family:verdana; font-size:12px; } .content { width:550px; margin:20px auto; } .content h1 { font-family:'微软雅黑'; font-size:18px; padding-bottom:5px; } table { width:100%; } th, td { padding:6px 0; text-align:center; } th { background-color:#007D28; color:#ffffff; } tr { background-color:#E8FFE8; } .odd { background-color:#FFF3EE; } .highlight { background-color:#FFF3EE; } </style> <script type="text/javascript"> //动态给js添加class属性 function addClass(element, value) { if(!element.className) { element.className = value; //如果element本身不存在class,则直接添加class为value的值 } else { element.className += " "+value; //如果element之前有一个class值,注意中间要多一个空格,然后再加上value的值 } } //鼠标经过时高亮显示 function highlightRows() { var rows = document.getElementsByTagName("tr"); for(var i=0; i<rows.length; i++) { rows[i].oldClassName = rows[i].className; //首先保存之前的class值 rows[i].onmouseover = function() { addClass(this, "highlight"); //鼠标经过时添加class为highlight的值 } rows[i].onmouseout = function() { this.className = this.oldClassName; //鼠标离开时还原之前的class值 } } } //比较之前进行数据转换 function convert(value, dataType) { switch(dataType) { case "int": return parseInt(value); break case "float": return parseFloat(value); break case "date": return Date.parse(value); break default: return value.toString(); } } //用于sort比较字符串 function compareCols(col, dataType) { return function compareTrs(tr1, tr2) { value1 = convert(tr1.cells[col].innerHTML, dataType); value2 = convert(tr2.cells[col].innerHTML, dataType); if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } }; } //对表格进行排序 function sortTable(tableId, col, dataType) { var table = document.getElementById(tableId); var tbody = table.tBodies[0]; var tr = tbody.rows; var trValue = new Array(); for (var i=0; i<tr.length; i++ ) { trValue[i] = tr[i]; //将表格中各行的信息存储在新建的数组中 } if (tbody.sortCol == col) { trValue.reverse(); //如果该列已经进行排序过了,则直接对其反序排列 } else { trValue.sort(compareCols(col, dataType)); //进行排序 } var fragment = document.createDocumentFragment(); //新建一个代码片段,用于保存排序后的结果 for (var i=0; i<trValue.length; i++ ) { fragment.appendChild(trValue[i]); } tbody.appendChild(fragment); //将排序的结果替换掉之前的值 tbody.sortCol = col; } window.onload = function() { highlightRows(); } </script> </head> <body> <div class="content"> <h1>会员信息表(点击表格标题可进行排序)</h1> <table summary="user infomation table" id="tableSort"> <thead> <tr> <th onclick="sortTable('tableSort', 0, 'int')" style="cursor: pointer;">会员ID</th> <th onclick="sortTable('tableSort', 1)" style="cursor: pointer;">会员名</th> <th onclick="sortTable('tableSort', 2)" style="cursor: pointer;">邮箱</th> <th onclick="sortTable('tableSort', 3)" style="cursor: pointer;">会员组</th> <th onclick="sortTable('tableSort', 4)" style="cursor: pointer;">城市</th> <th onclick="sortTable('tableSort', 5, 'date')" style="cursor: pointer;">注册时间</th> </tr> </thead> <tbody> <tr> <td>126</td> <td>webw3c</td> <td>este@126.com</td> <td>普通会员</td> <td>北京</td> <td>2011-04-13</td> </tr> <tr> <td>145</td> <td>test001</td> <td>test001@126.com</td> <td>中级会员</td> <td>合肥</td> <td>2011-03-27</td> </tr> <tr> <td>116</td> <td>wuliao</td> <td>wuliao@126.com</td> <td>普通会员</td> <td>南昌</td> <td>2011-04-01</td> </tr> <tr> <td>129</td> <td>tired</td> <td>tired@126.com</td> <td>中级会员</td> <td>北京</td> <td>2011-04-06</td> </tr> <tr> <td>155</td> <td>tiredso</td> <td>tireds0@126.com</td> <td>中级会员</td> <td>武汉</td> <td>2011-04-06</td> </tr> <tr> <td>131</td> <td>javascript</td> <td>js2011@126.com</td> <td>中级会员</td> <td>武汉</td> <td>2011-04-08</td> </tr> <tr> <td>132</td> <td>jQuery</td> <td>jQuery@126.com</td> <td>高级会员</td> <td>北京</td> <td>2011-04-12</td> </tr> </tbody> </table> </div> </body> </html>
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架