2011-07-26 31 views
1

好向导,有人知道如何做到这一点...防止在滚动浏览表的单个列的

我必须呈现为人们x个可用性的信息非常复杂的自定义控制(可能是1可是100)。 日历呈现控件属性中指定的任何给定日期范围。

这是什么意思是控件有可能会很长,所有这些数据都呈现为html表格。

随着每个人的名字出现在第一列即时消息寻找修复该列,并让表格的其余部分水平滚动,使用户可以浏览整个日期范围,但保持可见的人名。

让我怎么在表的地方,看起来像下面的代码固定第一列...

<table> 
    <tr><td></td><td colspan='31'>Jan</td><td colspan='28'>feb</td>...</tr> 
    <tr><td></td><td>1</td><td>2</td><td>3</td> ...<tr/> 
    <tr><td>Person 1</td><td></td><td></td><td>Busy</td> ...<tr/> 
    <tr><td>Person 2</td><td></td><td>Busy</td><td>Busy</td> ...<tr/> 
</table> 

万一它有助于以任何方式,这是一个C#应用程序(asp.net)如果需要,我愿意使用JavaScript。

谢谢你们:)

+0

我看到你正在使用ASP.Net,捆绑了jQuery的。你在使用jQuery吗? –

+0

我是...你知道jQuery解决方案? – War

+0

我想我发现了一个整洁的方式做到这一点,将表格封装在2个div标签中,并设置了一些css样式 – War

回答

1

好了,所以基于上述,我已经有我不得不承担固定柱将有一个固定的宽度,但我成功地做到这一点,表...

<div style="position:relative;"> 
    <div style="width:100%; overflow:scroll; height:400px;"> 

<table style="margin-left:100px;"> 
    <tr><td style="position:absolute;"></td><td colspan='31'>Jan</td><td colspan='28'>feb</td>...</tr> 
    <tr><td style="position:absolute;"></td><td>1</td><td>2</td><td>3</td> ...<tr/> 
    <tr><td style="position:absolute;">Person 1</td><td></td><td></td><td>Busy</td> ...<tr/> 
    <tr><td style="position:absolute;">Person 2</td><td></td><td>Busy</td><td>Busy</td> ...<tr/> 
</table> 

    </div> 
</div> 

这导致了标记的单元格在左边的绝对位置和表格仍然可滚动... 需要一点工作来清理它,使它看起来很漂亮,但基本上我的代码时提取出来看起来像这样...

<style type="text/css"> 
    .Calendar     { max-height:400px; border-collapse:collapse; table-layout:fixed; margin-left:105px; } 
    .Calendar .Resources { width:100px; position:absolute; left:0px; background:white; } 
    .Calendar tr    { vertical-align:top; } 
    .Calendar td    { border:solid 1px black; vertical-align:top; padding:2px; border:solid 1px #EFEFEF; } 
    .Calendar .day   { background:#FFFBD6; border:solid 1px #FEEFB3; } 
    .Calendar .dayWithEvent { background:white; border:solid 1px #FEEFB3; border-top:solid 1px blue; } 
</style> 

<div style="position:relative;"> 
    <div style="width:100%; overflow:scroll; height:400px;"> 
     <table class="Calendar"> 
      <asp:Repeater ID="ui_calMonths" runat="server" onitemdatabound="ui_calMonths_ItemDataBound"> 
        <HeaderTemplate> 
         <tr><td class="Resources" style="background:white; border:none;">&nbsp;</td> 
        </HeaderTemplate> 
        <ItemTemplate> 
         <td colspan='<%# ((Month)Container.DataItem).Days.Length %>'><%# Eval("Name") %></td> 
        </ItemTemplate> 
        <FooterTemplate> 
         </tr> 
         <tr><td class="Resources" style="background:white; border:none;">&nbsp;</td> 
          <asp:Repeater ID="ui_calDays" runat="server"> 
           <ItemTemplate> 
            <td><%# ((DateTime)Container.DataItem).ToString("dd") %></td> 
           </ItemTemplate> 
          </asp:Repeater> 
         </tr> 
        </FooterTemplate> 
       </asp:Repeater> 
      <asp:Repeater ID="ui_grdResources" runat="server"> 
       <HeaderTemplate><tr></HeaderTemplate> 
       <ItemTemplate> 
        <td class="Resources"><%# Eval("Text") %></td> 
        <%# ResourceEvents(((RowContext)Container.DataItem)) %> 
       </ItemTemplate> 
       <FooterTemplate></tr></FooterTemplate> 
      </asp:Repeater> 
     </table>  
    </div> 
</div> 

基本代码隐藏计算出有多少细胞每行中渲染(中继器在此工作基础,但结果基本上是一个很好的格式化表格包含给定日期范围内的月份名称在第一行中,第二个和第三个月的日期包含名称和从我的内部API日历项目动态填充的固定列......非常酷!

3

Here's a solution by Markku Uttula与CSS和HTML(下图)的组合来实现的。令人惊讶的是,即使在IE6上也能够表现出合理的性能。 V.令人印象深刻的工在Chrome,Opera和Firefox中的滚动条最终因某些原因冻结列/行下方,但希望在酒吧足够大,这将不会是一个问题......

CSS:

body { margin: 0; height: 100% } 
.b { border-collapse: collapse } 
.b td { border: 1px solid #f80; vertical-align: top } 
p { margin: 1px; padding: 0; font-size: 9px; font-family: Arial } 
p.c { text-align: center; font-size: 12px } 
p span { font-size: 12px; white-space:nowrap; color: #888 } 
/* TopLeft fixed corner */ 
td.bg101 { background-color: #ffc } 
/* Top fixed rows */ 
td.bg000 { background-color: #f8c } 
td.bg001 { background-color: #f4c } 
/* Left fixed rows */ 
td.bg110 { background-color: #fcc } 
td.bg111 { background-color: #fcf } 
/* The scrollable content area */ 
td.bg010 { background-color: #fff } 
td.bg011 { background-color: #ff4 } 

的JavaScript:

var ieBug = ((document.all) && (!window.opera)); // IE doesn't really handle fixed elements well :) 
var fpElement = false; 
function fpCW() { return document.documentElement ? document.documentElement.clientWidth : document.clientWidth; } 
function fpCH() { return document.documentElement ? document.documentElement.clientHeight : document.clientHeight; } 
function fpTopLeft(elementNode, iTop, iLeft) { 
    elementNode.style.top = (iTop)+"px"; 
    elementNode.style.left = (iLeft)+"px"; 
} 
function fpDefaults(elementNode) { 
    elementNode.style.position = ieBug ? "absolute" : "fixed"; 
    fpTopLeft(elementNode,0,0); 
    return elementNode; 
} 
function fpClone(elementNode, cloneZindex) { 
    var clone = fpDefaults(elementNode.cloneNode(true)); 
    clone.style.background = "#fff"; 
    clone.style.overflow = "hidden"; 
    clone.style.border = "none"; 
    clone.style.zIndex = cloneZindex; 
    return clone; 
} 
function fpInitFreezePanes(fpTableElementId, fpTableContainerDivElementId, fpPivotCellId, fpDisableBodyScrollbars) { 
    if (fpElement !== false) { 
     alert("Page already contains an element with fixed panes."); 
    } else { 
     var fpTableElement = document.getElementById(fpTableElementId); 
     var fpTableContainerDivElement = document.getElementById(fpTableContainerDivElementId); 
     var fpPivotCell = document.getElementById(fpPivotCellId); 
     if ((!fpTableElement) || (!fpTableContainerDivElement) || (!fpPivotCell)) { 
      alert("Unable to find table, container or pivoting cell?"); 
     } else { 
      fpElement = fpTableContainerDivElement; 
      if (fpDisableBodyScrollbars) { 
       var x = document.getElementsByTagName("body")[0]; 
       x.style.overflow = "hidden"; 
       x = document.getElementsByTagName("html")[0]; 
       x.style.overflow = "hidden"; 
      } 
      fpTableContainerDivElement = fpDefaults(fpTableContainerDivElement); 
      fpTableContainerDivElement.style.width = (fpCW()-2)+"px"; 
      fpTableContainerDivElement.style.height = (fpCH()-2)+"px"; 
      fpTableContainerDivElement.fpPT = fpPivotCell.offsetTop; 
      fpTableContainerDivElement.fpPL = fpPivotCell.offsetLeft; 

      var copy1 = fpClone(fpTableContainerDivElement, 4); 
      copy1.style.width = (fpTableContainerDivElement.fpPL)+"px"; 
      copy1.style.height = (fpTableContainerDivElement.fpPT)+"px"; 
      var copy2 = fpClone(fpTableContainerDivElement, 3); 
      copy2.style.width = (fpTableElement.offsetWidth)+"px"; 
      copy2.style.height = (fpTableContainerDivElement.fpPT)+"px"; 
      var copy3 = fpClone(fpTableContainerDivElement, 2); 
      copy3.style.width = (fpTableContainerDivElement.fpPL)+"px"; 
      copy3.style.height = (fpTableElement.offsetHeight)+"px"; 

      fpTableContainerDivElement.style.zIndex = 1; 
      fpTableContainerDivElement.appendChild(copy1); 
      fpTableContainerDivElement.copy1 = copy1; 
      fpTableContainerDivElement.appendChild(copy2); 
      fpTableContainerDivElement.copy2 = copy2; 
      fpTableContainerDivElement.appendChild(copy3); 
      fpTableContainerDivElement.copy3 = copy3; 
      fpTableContainerDivElement.repositioning = false; 
      fpTableContainerDivElement.oldST = -1; 
      fpTableContainerDivElement.oldSL = -1; 
      fpTableContainerDivElement.style.overflow = "scroll"; 

      /* JUST SOME STYLING HERE */ 
      copy1.style.borderRight = "1px dashed #000"; 
      copy1.style.borderCollapse = "collapse"; 
      copy2.style.borderBottom = "1px dashed #000"; 
      copy2.style.borderCollapse = "collapse"; 
      copy3.style.borderRight = "1px dashed #000"; 
      copy3.style.borderCollapse = "collapse"; 
      /* JUST SOME STYLING HERE */ 

      // if (ieBug) { 
      if (fpTableContainerDivElement.style.setExpression) { 
       function fpIeBugFix(elementNode, containerNodeId, arrayOfExpressionsToSet) { 
        for (var i in arrayOfExpressionsToSet) { 
         if (arrayOfExpressionsToSet[i][2]) { 
          elementNode.style.setExpression(arrayOfExpressionsToSet[i][0], arrayOfExpressionsToSet[i][1]+"document.getElementById('"+containerNodeId+"')."+arrayOfExpressionsToSet[i][2]+"+'px'"); 
         } else { 
          elementNode.style.setExpression(arrayOfExpressionsToSet[i][0], arrayOfExpressionsToSet[i][1]); 
         } 
        } 
       } 
       fpIeBugFix(fpTableContainerDivElement.copy3, fpTableContainerDivElementId, [["top","","scrollTop"],["left","","scrollLeft"],["marginTop","-","scrollTop"]]); 
       fpIeBugFix(fpTableContainerDivElement.copy2, fpTableContainerDivElementId, [["top","","scrollTop"],["left","","scrollLeft"],["marginLeft","-","scrollLeft"]]); 
       fpIeBugFix(fpTableContainerDivElement.copy1, fpTableContainerDivElementId, [["top","","scrollTop"],["left","","scrollLeft"]]); 
       fpIeBugFix(fpTableContainerDivElement, fpTableContainerDivElementId, [["width","fpCW()+'px'"],["height","fpCH()+'px'"]]); 
       document.recalc(true); 
      } else { 
       fpElement.onmousemove = fpElement.onscroll = function() { 
        if (!this.repositioning) { 
         this.repositioning = true; 
         var st = this.scrollTop; 
         var sl = this.scrollLeft; 
         if ((this.oldST != st) || (this.oldSL != sl)) { 
          this.oldST = st; 
          this.oldSL = sl; 
          // this.copy3.previousDisplay = this.copy3.style.display; 
          // this.copy3.style.display = "none"; 
          this.copy3.style.marginTop = "-"+(st)+"px"; 
          // this.copy3.style.display = this.copy3.previousDisplay; 
          // this.copy2.previousDisplay = this.copy2.style.display; 
          // this.copy2.style.display = "none"; 
          this.copy2.style.marginLeft = "-"+(sl)+"px"; 
          // this.copy2.style.display = this.copy2.previousDisplay; 
         } 
         fpElement.repositioning = false; 
        } 
       }; 
       window.onresize = function() { 
        fpElement.style.width = fpCW()+"px"; 
        fpElement.style.height = fpCH()+"px"; 
       } 
      } 
     } 
    } 
} 
+0

恩,好吧...看起来有点...涉及...为什么它需要身体和html元素? ? ...也不能在他的IE8页面上工作... – War

+0

@Wardy:按照链接,这里有一个完整的现场演示。将它合并到你的页面中,看起来像键调用是'fpInitFreezePanes',在这里你传入表的ID,一个包含表的div的ID,以及你想要冻结的单元的ID窗格。 –

+0

大声笑,我发现了...... sry回合......我编辑了评论,以反映这个笑声......它非常酷,当它实际上工作虽然 – War