显示数据是指在任意查询表单或者固定查询选项面板中,设置完毕查询条件,然后单击“确定”按钮进行查询时,将在页面底部显示查询的结果,以数据表格的形式进行显示,演示效果如图1所示。

图1 显示数据
showData ()函数功能相对复杂,它涉及多个复杂功能:
- 从数据库中读取数据,然后根据数据类型分别显示表格标题行信息,并逐一显示每条记录。
- 为每条记录绑定“修改”、“删除”、“查看”等操作按钮,并为这些按钮绑定对应的操作函数。
- 分别根据不同类型的数据,执行不同的数据显示样式。
- 分别为不同数据列绑定不同的类,以方便后期执行各种操作。
- 为方便添加数据,还必须在数据库表最后添加一行空白行,并隐藏显示空白单元格。
另外,在该函数中还要解决表格标题区域、数据主体区域以及脚部区域的功能划分和设置。特别是在表格脚部区域要绑定一些功能表单和事件,如隐藏列、按表格过滤数据、按列过滤数据、金额汇总等功能项,同时还要为日后功能扩展做好准备,如图23.28所示,实现的代码如下。
//===================================
//在指定的包含框中显示指定记录集中的数据
//参数
//paraobj {
//box:显示数据的包含框,DOM对象
//rs:显示的记录集,数据集合对象
//table:显示数据对应的数据表,字符串
//}
//返回值:如果操作成功返回true,否则返回false
var showdata = function(paraobj){
var _paraobj = paraobj; //保存参数
var paraobj = {};
for(var name in _paraobj){
paraobj[name] = _paraobj[name];
}
if(!paraobj.box){ //处理参数值
alert("没有指明显示数据的包含框!");
return false;
}else
var box = paraobj.box;
if(!paraobj.table){
alert("没有指明当前表格显示数据对应的数据表!");
return false;
}else
var table = paraobj.table;
if(!paraobj.rs){
alert("没有传递记录集!");
return false;
}else
var rs = paraobj.rs;
//验证记录集是否为空
//针对分类表,可允许记录集为空,以方便用户新添加类别
if( rs.eof && (tableobj[table][5] != "class" )){
alert("没有记录集!");
return false;
}
//生成数据表格的HTML结构字符串
//=========================
//表格头部
var html = "<table><thead>";
html += "<tr>";
//记录集的字段集合
fds = rs.Fields;
for(var i=0; i<fds.count; i++){ //遍历字段集,生成标题行
html += "<th class='"+ fds.Item(i).name +"_thead'>" + fieldobj[fds.Item(i).name][1] + "</th>";
}
//操作列
html += "<th>修改</th>";
html += "<th>删除</th>";
if(tableobj[table][4] != "no")
html += "<th>明细</th>";
html += "</thead>";
//=========================
//表格数据区域
if(!rs.eof) {
html += "<tbody>";
while (!rs.eof){
if(rs("update") != null && String(rs("update")).length > 8 ){ //显示被更新记录的数据行
var showvalue = formatData(rs("update"),{//格式化时间显示
field: "update"
});
if(showvalue)
html += "<tr class='updated' title='本条记录已被修改,修改时间为:"+ showvalue +"'>";
else
html += "<tr>";
}else{ //显示为被修改的记录数据列
html += "<tr>";
}
for(var i=0; i<fds.count; i++){ //显示单元格数据
var fieldname = fds.Item(i).name;
var rsvalue = rs(fieldname);
var showvalue = formatData(rsvalue,{
field: fieldname,
table: table
});
if(!showvalue) showvalue = "";
html += "<td class='"+ fieldname +"'>" + showvalue + "</td>";
}
html += "<td class='edit'>修改</td>";
html += "<td class='del'>删除</td>"
//如果包含明细信息,则多显示一个单元格,添加查看按钮
if(tableobj[table][4] != "no")
html += "<td class='detail'>查看</td>" ;
html += "</tr>"
rs.moveNext;
}
html += "</tbody>"
}else {//如果记录集为空,则新添加一行隐藏的空数据行
html += "<tbody>";
html += "<tr class='hide'>";
for(var i=0; i<fds.count; i++){ //显示单元格数据
html += "<td class='"+ fds.Item(i).name +"'></td>";
}
html += "<td class='edit'></td>";
html += "<td class='del'></td>"
if(tableobj[table][4] != "no") //如果包含明细信息,则多显示一个单元格
html += "<td></td>"
html += "</tr>"
}
//=========================
//表格页脚
html += "<tfoot>";
html += "<tr>"//第1行
if(tableobj[table][5] != "class"){ //如果不是分类表,则显示金额统计功能
html += "<td class='_tfoot' colspan="+fds.count+"><span class='colsearch'>在列中查询</span><span
class='tablesearch'>在表中查询</span><span class='tableinput'><input value='' type=text /></span> <spanclass=
'colhide'>隐藏列</span><span class='sumprice'> 统计金额 </span><spanclass= 'sumpricevalue'></span>
</td>";
}else{ //如果是分类表,则不添加金额统计功能
html += "<td class='_tfoot' colspan="+fds.count+"><span class='colsearch'>在列中查询</span><span
class='tablesearch'>在表查询</span><span class='tableinput'><input value='' type=text /></span><span
class= 'colhide'>隐藏列</span></td>";
}
html += "<td class='add_tfoot'>添加记录</td>"; //添加记录按钮
//如果是明细表,则添加隐藏明细表的按钮
if(box.getAttribute("id") == "showdetailbox" || box.getAttribute("id") == "showsubdetailbox")
html += "<td class='del_detailbox'>删除该表</td>";
else
html += "<td class='del_tfoot'></td>";
if(tableobj[table][4] != "no") //如果包含明细信息,则多显示一个单元格
html += "<td class='detail_tfoot'></td>"
html += "</tr>"
html += "<tr>" //第二行
//添加字段列搜索文本框
for(var i=0; i<fds.count; i++){
html += "<td class='searchcol'><div>"+ fieldobj[fds.Item(i).name][1] +"</div><input value='' type=text
/></td>";
}
html += "<td></td>"; //空单元格
html += "<td></td>";
if(tableobj[table][4] != "no") //如果包含明细信息,则多显示一个单元格
html += "<td></td>"
html += "</tr>"
html += "<tr>"//第3行
for(var i=0; i<fds.count; i++){ //为每个字段列添加复选框,以便显示或隐藏该列
html += "<td class='hidecol'><div>"+ fieldobj[fds.Item(i).name][1] +"</div><input type='checkbox'
checked='checked' /></td>";
}
html += "<td></td>"; //空单元格
html += "<td></td>";
if(tableobj[paraobj.table][4] != "no") //如果包含明细信息,则多显示一个单元格
html += "<td></td>"
html += "</tr>" //第三行结束
html += "</tfoot>"
html += "</table>";
//=========================
//在查询显示框中显示查询数据
box.innerHTML = html;
//其他需要处理的问题
//临时保存数据表主体数据的最后一行,当数据被删除完后备用,添加记录时,需要用数据行
window.tbodytr = box.getElementsByTagName("tbody")[0].lastChild;
tablebg("#EAF3FC","#fff"); //设置表格动态样式
$('table').tablesorter({ //为表格绑定列排序外部插件,需要jQuery配合
cancelSelection:true, //禁止选区表头
cssAsc:"up", //设置升序样式
cssHeader:"head", //设置表头默认样式
cssDesc:"down" //设置降序样式
});
return true; //显示成功最后返回true
}