基于各种浏览器的GridView实现标题及固定列小感

 对于基于B/S结构的管理程序中,有很多报表需要设定固定表头和固定列显示。
而可以固定表头和固定列的Grid控件C/S模式下很多,但B/S下少之甚少,且费用也相应的昂贵。

但是上帝推出HTML的时候,他也并没有忘记HTML的扩展性。我们可以使用CSS和Javascript完全可以实现。

第一部分:CSS + Javascript 实现固定表头和固定列

该部分内容IE中GridView实现标题及固定列小感一文中说明过
先看一下效果图。

该部分的控制主要依靠CSS中嵌入Javascript来实现滚动效果。

  1.     <style type='text/css'>
  2.         /*<![CDATA[*/
  3.         .FreezingHead
  4.         {
  5.             position: relative;
  6.             top: expression(this.offsetParent.scrollTop);
  7.             z-index: 2;
  8.             background-color: White;
  9.         }
  10.         .FreezingCol
  11.         {
  12.             left: expression(document.getElementById('div').scrollLeft);
  13.             position: relative;
  14.             z-index: 1;
  15.         }
  16.         /*]]>*/
  17.     </style>
其中重点就是 在CSS中 使用 expression。
使用的时候指示在现实数据的Table中标题行的Tr标签中引用 Freezing Head 的Class,在每一个固定列中引用 FreezingCol 的Class,相应的HTML代码如下:
  1. <div id="div" style="height: 250px; width: 600px; overflow: auto;">
  2.   <table cellspacing="1" cellpadding="4" border="0" style="color: #333333;background-color: #333333; width: 700px;">
  3.      <tr class="FreezingHead" style="color: White; background-color: #333333;font-weight: bold;">
  4.        <th align="center" scope="col" style="background-color: #507CD1;" class="FreezingCol">
  5.          Name
  6.        </th>
  7.        <th align="center" scope="col" style="background-color: #507CD1;">
  8.          Grade
  9.        </th>
  10.        <th align="center" scope="col" style="background-color: #507CD1; width: 400px;">
  11.          Address
  12.        </th>
  13.      </tr>
  14.      <tr style="background-color: #EFF3FB;">
  15.        <td class="FreezingCol">
  16.          Abraham
  17.        </td>
  18.        <td>
  19.          56'
  20.        </td>
  21.        <td style="white-space: nowrap;">
  22.          10/104 New Delhi GT road
  23.        </td>
  24.      </tr>
  25.      <!-- 数据循环 -->       
  26.    </table>
  27. </div>
这种方法的优点是实现简单,易懂,轻便的特点。
但是他的 致命落点是兼容性太差。在几种不同内核版本的浏览器的测试中,Mozilla的FireFox, Apple的Safari以及Opera Software ASA的Opera中均不可运行。唯独Microsoft的IE中表现上佳。
这是因为 CSS中expression的使用目前越来越淡忘,目前只有IE支持 expression。而且在新的CSS版本和XHTML文档定义中也已经取缔使用 expression,如果在页面中使用文档定义(即<!DOCTYPE标签)则任何浏览器均不支持 expression,同样上述功能也不能实现。
所以使用CSS + Javascript 实现固定表头和固定列是必须删除 文档定义(即<!DOCTYPE标签),类似下面代码:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
第二部分:Javascript + 多表联动 实现固定表头和固定列

先看一下效果图。

该部分的控制主要依靠Javascript控制多表联动来实现滚动效果。

  1.     <script type="text/javascript" language="javascript">
  2.     /*<![CDATA[*/
  3.     function scroll() {
  4.       var x = document.getElementById("DataList").scrollLeft;
  5.       document.getElementById("Title").style.left = (0 - x) + "px";
  6.       var y = document.getElementById("DataList").scrollTop;
  7.       document.getElementById("LeftData").style.top = (0 - y) + "px";
  8.     }
  9.     /*]]>*/
  10.     </script>
上面的Javascript就是控制多表联动的代码。
该方式的主要是组合Table的排列问题。下图显示各表的排列。

其中#A区域显示固定列的标题;#B显示可横向滚动的标题;#C显示固定列的数据;#D显示可滚动数据。
然后再#D滚动是横向带动#B区域,竖向带动#C区域来实现。当然每个区域层的上下关系也必须保证#A>#B>#C>#D的顺序。
可是因为在页面加载的默认过程也是#A,#B,#C,#D的顺序,所以可以忽略。
其页面代码如下:
  1. <table id="Table0" border="0" cellpadding="0" cellspacing="0" style="width: 600px;">
  2.     <tr>
  3.         <td valign="top">
  4.             <table border="0" cellpadding="4" cellspacing="1" bgcolor="#535d7c" style="width: 120px;">
  5.                 <tr>
  6.                     <th align="center" scope="col" style="background-color: #507CD1; width: 120px">
  7.                         Name
  8.                     </th>
  9.                 </tr>
  10.             </table>
  11.         </td>
  12.         <td valign="top">
  13.             <div id="head" style="position: absolute; overflow: hidden; width: 480px; height: 30px;">
  14.                 <div id="intitle" style="position: absolute;">
  15.                     <table id="Table2" border="0" cellpadding="4" cellspacing="1" bgcolor="#535d7c" style="width: 580px;">
  16.                         <tr>
  17.                             <th align="center" scope="col" style="background-color: #507CD1;">
  18.                                 Grade
  19.                             </th>
  20.                             <th align="center" scope="col" style="background-color: #507CD1; width: 400px;">
  21.                                 Address
  22.                             </th>
  23.                         </tr>
  24.                     </table>
  25.                 </div>
  26.             </div>
  27.         </td>
  28.     </tr>
  29.     <tr>
  30.         <td valign="top">
  31.             <div id="list2" style="position: absolute; overflow: hidden; width: 120px; height: 235px;">
  32.                 <div id="leftTitle" style="position: absolute">
  33.                     <table id="Table4" border="0" cellpadding="4" cellspacing="1" bgcolor="#535d7c" style="width: 120px;">
  34.                         <tr style="background-color: #EFF3FB;">
  35.                             <td>
  36.                                 Abraham
  37.                             </td>
  38.                         </tr>
  39.                         <!-- 循环显示固定列数据 -->
  40.                     </table>
  41.                 </div>
  42.             </div>
  43.         </td>
  44.         <td valign="top">
  45.             <table id="Table1" width="100%" border="0" cellpadding="0" cellspacing="0" style="table-layout: fixed">
  46.                 <tr>
  47.                     <td valign="top">
  48.                         <div id="list" onscroll="f_scroll()" style="overflow: auto; width: 100%; height: 250px;">
  49.                             <table id="Table3" border="0" cellpadding="4" cellspacing="1" bgcolor="#535d7c" style="width: 580px;">
  50.                                 <tr style="background-color: #EFF3FB;">
  51.                                     <td>
  52.                                         56'
  53.                                     </td>
  54.                                     <td style="white-space: nowrap; width: 400px;">
  55.                                         10/104 New Delhi GT road
  56.                                     </td>
  57.                                 </tr>
  58.                                 <!-- 循环显示可滚动列数据 -->
  59.                             </table>
  60.                         </div>
  61.                     </td>
  62.                 </tr>
  63.             </table>
  64.         </td>
  65.     </tr>
  66. </table>
大家可以去自己分析代码。

这种方法虽然比第一种方法复杂,但比较符合现行的XHTML和HTML的标准,故其兼容性比第一种较好。
在几种不同内核版本的浏览器的测试中,Mozilla的FireFox和Microsoft的IE中表现上佳,唯独Apple的Safari以及Opera Software ASA的Opera中均运行不良。但考虑到目前浏览器市场份额角度上,此种方法可以满足绝大部分用户的需求。

总结词

随然固定标题和固定列的实现会解决基于B/S结构的报表的很大问题,但使用时需要根据数据量大小,客户需求使用不同的解决方案,具体问题永远是具体解决的。所以不敢奢望本文对大家有巨大的帮助,但希望对大家的开发有所参考价值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值