显示数据

课后整理 2021-2-25

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