项目中本来用的是ext做前台开发的,但是ext不好实现合并行,所以用jsp写了个动态合并的功能,效果如图: 现在的问题是我在输入车数的时候,比如:区域:一炼钢,渣类:D渣,对应了四个去向,输入4个1的时候,日累计车数自动计算,应该生成;,而一炼钢,1#滚筒渣 车数输入2的时候,日累计车数应该为2;但是因为jsp是通过循环得到的数据,然后根据名称相同的合并,任何字段只有一个ID,现在无法准备判断,我输入的哪几列的的车数,相加应该放到哪一列的日累计车数下。 问题我觉得有点难,希望有高手能帮忙解决下,非常感谢!顶者有分!现在分数最多只能给100分,多个论坛里都有,明天再加。希望大家能帮帮忙

解决方案 »

  1.   

    触发D渣对应车数列文本框的onkeyup事件,用JS写,遍历当前所有属于D渣的文本框,把相加得到的值赋值给日累计车数。
      

  2.   


    <TABLE border="1" id="tab" width="500">
      <TBODY>
      <TR align="center">
        <TD>A</TD>
        <TD>B</TD>
        <TD>C</TD>
        <TD>D</TD>
        <TD>E</TD>
        <TD width="50">F</TD>
        <TD width="50">G</TD>
      </TR>
      <TR align="center">
        <TD rowspan="7">A1</TD>
        <TD rowspan="4">B1</TD>
        <TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
        <TD><INPUT TYPE="text" size="3" name="d"></TD>
        <TD>D2</TD>
        <TD rowspan="4">&nbsp;</TD>
        <TD rowspan="4">&nbsp;</TD>
      </TR>
      <TR align="center">
        <TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
        <TD><INPUT TYPE="text" size="3" name="d"></TD>
    <TD>2</TD>
      </TR>
      <TR align="center">
        <TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
        <TD><INPUT TYPE="text" size="3" name="d"></TD>
    <TD>2</TD>
      </TR>
      <TR align="center">
        <TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
        <TD><INPUT TYPE="text" size="3" name="d"></TD>
    <TD>2</TD>
      </TR>
      <TR align="center">
        <TD rowspan="2">B2</TD>
        <TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
        <TD><INPUT TYPE="text" size="3" name="d"></TD>
    <TD>2</TD>
    <TD rowspan="2">&nbsp;</TD>
    <TD rowspan="2">&nbsp;</TD>
      </TR>
      <TR align="center">
        <TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
        <TD><INPUT TYPE="text" size="3" name="d"></TD>
    <TD>2</TD>
      </TR>
      <TR align="center">
        <TD>B3</TD>
        <TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
        <TD><INPUT TYPE="text" size="3" name="d"></TD>
    <TD>2</TD>
    <TD>&nbsp;</TD>
    <TD>&nbsp;</TD>
      </TR>
      <TR align="center">
        <TD>A2</TD>
        <TD>B4</TD>
        <TD><INPUT TYPE="text" size="5" name="c" onchange="count(this)"></TD>
        <TD><INPUT TYPE="text" size="3" name="d"></TD>
    <TD>2</TD>
    <TD>&nbsp;</TD>
    <TD>&nbsp;</TD>
      </TR>
      </TBODY>
    </TABLE><SCRIPT language=JavaScript>
    var tab = document.getElementById("tab");
    function count(inp){
    var td = inp.parentElement;
    var tr = inp.parentElement.parentElement;
    for (var i=tr.rowIndex; i>0; i--) //从填写数值的行往表头方向查找
    {
    if (tab.rows[i].cells.length >= tab.rows(0).cells.length-1) //找到B栏显示的那一行(即有rowspan=""的td所在的tr)
    {
    var span,num = 0;
    var inps = document.getElementsByName("c");
    var dayTD = tab.rows[i].cells[tab.rows[i].cells.length - 2]; //因不能判定前方的列是否发生过合并,所以从后方向前找到合计单元格(倒数第2格)
    if (tab.rows[i].cells.length == tab.rows(0).cells.length)  //A栏未被合并,B栏为第2格
    span = isNaN( parseInt( tab.rows[i].cells[1].rowSpan,10) ) ? 1 : parseInt( tab.rows[i].cells[1].rowSpan,10);
    else //A栏被合并,B栏为第1格
    span = isNaN( parseInt( tab.rows[i].cells[0].rowSpan,10) ) ? 1 : parseInt( tab.rows[i].cells[0].rowSpan,10);
    //在input数组中相应范围内循环相加
    for (var j=(i-1); j<(i+span-1); j++)
    {
    num += isNaN( parseInt(inps[j].value,10) ) ? 0 : parseInt(inps[j].value,10);
    }
    dayTD.innerHTML = num;
    break;
    }
    }
    }
    </SCRIPT>
      

  3.   

    <script type="text/javascript">
    //用jQuery弄的.....快上班了...希望可以帮你
    function t(event)  {
     var td = this;
     var tr = $(td).parent();
     while(tr.children().length <= 3) tr = tr.prev();
     //此时的tr就是包含你要修改的区域的那个tr了
    }
    </script>
      

  4.   


    好强啊,刚运行了下你的代码,就是那种效果,不过,我这数据是动态的,table里面其实就是数据库查询出来一行一行的数据,只不过,用js把数据相同的合并了,所以你这边
     var dayTD = tab.rows[i].cells[tab.rows[i].cells.length - 2]; //因不能判定前方的列是否发生过合并,所以从后方向前找到合计单元格(倒数第2格) 我现在根本就不能确定是哪一行,哪一列了。因为js代码是这样写的,将表的结构给打乱了。
    <SCRIPT>
    function   uniteTable(thistab){   
      var rn=thistab.rows.length;//取得行数
      var rowspann=0;   
      var j = 2;
      var colcnt=new Array();
      for(var k=0;k<rn;k++){
        colcnt[k]=0;
      }
      for(i=rn-1;i>0;i--){//从倒数第一行开始往上检查   
          if(thistab.rows[i].cells[j].childNodes[0].data==thistab.rows[i-1].cells[j].childNodes[0].data&&thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
          {//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。   
             rowspann+=thistab.rows[i].cells[j].rowSpan; 
     colcnt[i]++; 
             thistab.rows[i].deleteCell(j); 
          }else {   
            thistab.rows[i].cells[j].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
            rowspann=0;   
          }   
       }   
     } 
    uniteTable(document.getElementById("table1"));
     </SCRIPT>这是合并第一列,如何第二列,第三列,只是需要改一下var j = "" 就可以了
      

  5.   


    我在web开发里也发了一个,3楼的思路我觉得还挺适合,不过,现在有个小问题,希望大家能帮忙看看http://topic.csdn.net/u/20100527/16/ee1fc2a7-3bb2-4bf9-ad23-c4e13dbaa3ce.html
      

  6.   


    这段代码貌似没啥影响,3楼的代码就是应对表结构被破坏之后的情况
    需要填写合计的是倒数第n列,var dayTD = tab.rows[i].cells[tab.rows[i].cells.length - n]; 就可以了
    LZ可以试试,我觉得应该没影响 
      

  7.   

    试试看,在留言板也给你发了
    刚才还是论坛维护中,现在又好了……  
    HTML部分<table width="100%" height="100%" border="0" cellpadding="0"
    cellspacing="0" class="table_main">
    <tr>
    <td valign="top">
    <table width="100%" border="0" cellspacing="1" cellpadding="1">
    <tr>
    <td>
    <div id="advancedSearch" style="visible: yes">
    <table width="100%" border="0" cellspacing="1" cellpadding="1"
    class="table_search">
    <tr>
    <td align="left">
    <form name="form1" method="post" action="">
    <table border="0" width="100%" align="left" cellpadding="0"
    cellspacing="0" class="content12">
    <tr>
    <td align="right">
    统计日期&nbsp;
    </td>
    <td align="left">
    <div id="statisticDateDiv"></div></td>
    <td>
    <input id="baseSaveBtn" type="button" value="保 存"
    class="button2" onclick="saveBasicInfo()">
    </td>
    </tr>
    </table>
    </form>
    </td>
    </tr>
    </table>
    </div>
    </td>
    </tr><tr>
    <td>
    <div id="gridDiv"
    style="visible: yes; overflow: auto; height: 400px">
    <table width="100%" border="1" cellspacing="1" cellpadding="1"id="table1">
    <form id="myform" name="myform">
    <tr>
    <td colspan="4">
    <input name="add" type="button" class="button2"
    onClick="addBaseInfo();" value="添 加">
    <input name="del" type="button" class="button2"
    onClick="delBaseInfo(document.myform.trZhaRegionPlaceId);"
    value="删 除">
    </td>
    </tr>
    <tr bgcolor=skyblue height=25 align="center">
    <td>
    <input type="checkbox"
    onClick="cc(document.myform.trZhaRegionPlaceId)">
    </td>
    <td>序号</td><td>区域</td><td>渣类</td><td>车数</td><td>吨位</td><td>去向</td><td>是否出厂</td><td>日累计车数</td><td>日累计吨位</td><td>总计车数</td><td>总计吨位</td>
    </tr><tr class="table_c1">
    <td>
    <input type="checkbox" value="618"
    id="trZhaRegionPlaceId" name="trZhaRegionPlaceId">
    </td>
    <td>1</td>
    <td>一炼钢</td>
    <td>D渣</td>
    <td>
    <input type="text" name="carQty" id="carQty" size="8" onchange="count(this)" onkeydown="pre=this.value" value="">
    </td>
    <td>
    <input type="text" name="tonnage" id="tonnage" size="8" onblur="doCheck2(this)" value="">
    </td>
    <td>
    <input type="hidden" id="placeName" name="placeName"
    value="闷罐">
    闷罐
    </td>
    <td>
    <input type="checkbox" id="isProduce" name="isProduce"
    checked="checked">
    </td>
    <td>
    <div id="614615"></div>
    </td>  
    <td>
    <div id="oneTonnage"></div>
    </td>
    <td>
    <div id="sumCarQty"></div>
    </td>
    <td>
    <div id="sumTonnage"></div>
    </td>
    </tr><tr class="table_c1">
    <td>
    <input type="checkbox" value="620"
    id="trZhaRegionPlaceId" name="trZhaRegionPlaceId">
    </td>
    <td>2</td>
    <td>一炼钢</td>
    <td>D渣</td>
    <td>
    <input type="text" name="carQty" id="carQty" size="8" onchange="count(this)" onkeydown="pre=this.value" value="">
    </td>
    <td>
    <input type="text" name="tonnage" id="tonnage" size="8" onblur="doCheck2(this)" value="">
    </td>
    <td>
    <input type="hidden" id="placeName" name="placeName"
    value="灰池">
    灰池
    </td>
    <td>
    <input type="checkbox" id="isProduce" name="isProduce">
    </td>
    <td>
    <div id="614615"></div>
    </td>  
    <td>
    <div id="oneTonnage"></div>
    </td>
    <td>
    <div id="sumCarQty"></div>
    </td>
    <td>
    <div id="sumTonnage"></div>
    </td>
    </tr><tr class="table_c1">
    <td>
    <input type="checkbox" value="622"
    id="trZhaRegionPlaceId" name="trZhaRegionPlaceId">
    </td>
    <td>3</td>
    <td>一炼钢</td>
    <td>D渣</td>
    <td>
    <input type="text" name="carQty" id="carQty" size="8"
    onchange="count(this)" onkeydown="pre=this.value" value="">
    </td>
    <td>
    <input type="text" name="tonnage" id="tonnage" size="8"
    onblur="doCheck2(this)" value="">
    </td>
    <td>
    <input type="hidden" id="placeName" name="placeName"
    value="出厂">
    出厂
    </td>
    <td>
    <input type="checkbox" id="isProduce" name="isProduce">
    </td>
    <td>
    <div id="614615"></div>
    </td>  
    <td>
    <div id="oneTonnage"></div>
    </td>
    <td>
    <div id="sumCarQty"></div>
    </td>
    <td>
    <div id="sumTonnage"></div>
    </td>
    </tr>
    <tr class="table_c1">
    <td>
    <input type="checkbox" value="624"
    id="trZhaRegionPlaceId" name="trZhaRegionPlaceId">
    </td>
    <td>4</td>
    <td>一炼钢</td>
    <td>D渣</td>
    <td>
    <input type="text" name="carQty" id="carQty" size="8"
    onchange="count(this)" onkeydown="pre=this.value" value="">
    </td>
    <td>
    <input type="text" name="tonnage" id="tonnage" size="8"
    onblur="doCheck2(this)" value="">
    </td>
    <td>
    <input type="hidden" id="placeName" name="placeName"
    value="开发">
    开发
    </td>
    <td>
    <input type="checkbox" id="isProduce" name="isProduce">
    </td>
    <td>
    <div id="614615"></div>
    </td>  
    <td>
    <div id="oneTonnage"></div>
    </td>
    <td>
    <div id="sumCarQty"></div>
    </td>
    <td>
    <div id="sumTonnage"></div>
    </td>
    </tr>
    </form>
    </table></div>
    </td>
    </tr>
    </table>
    </td>
    </tr>
    </table>
      

  8.   

    脚本部分<script type="text/javascript">
    /*因报错,所以注掉了
    var parentWin = window.parent;
    var scrollTop = document.body.scrollTop;
    var scrollLeft = document.body.scrollLeft;
    if (parentWin.grid_.operatorType==1){
    clearValues(); 
    } else if (parentWin.grid_.operatorType==2){
    setValues(); 
    }
    function clearValues(){
    $("statisticDate").disabled= false;
    $("statisticDate").value = "<%=date%>";
    }
    function setValues(){
    var m = parentWin.grid_.getSelectionModel().getSelections();
    $("statisticDate").disabled= true;
    $("statisticDate").value = m[0].get("statisticDate");
    }
    //复选框全选或是反选功能
    function cc(oj) {
    for (var i=0;i<oj.length;i++ ) {
      if (oj[i].checked)
      {
      oj[i].checked=false;
      } else
      {
      oj[i].checked=true;
      }
     }
    }
    */
    </script>
    <SCRIPT type="text/javascript">
    function uniteTable5(thistab){   
      var rn=thistab.rows.length;//取得行数
      var rowspann=0;   
      var j = 2;
      var m = 11;
      var colcnt=new Array();
      for(var k=0;k<rn;k++){
      colcnt[k]=0;
      }
      for(i=rn-1;i>1;i--){//从倒数第一行开始往上检查   
      if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
      {//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。   
      rowspann+=thistab.rows[i].cells[m].rowSpan;  
    colcnt[i]++;  
      thistab.rows[i].deleteCell(m);  
      }else {   
      thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
      rowspann=0;   
      }   
      }   
     }  
    uniteTable5(document.getElementById("table1"));
     </SCRIPT>
    <SCRIPT>
    function uniteTable4(thistab){   
      var rn=thistab.rows.length;//取得行数
      var rowspann=0;   
      var j = 2;
      var m = 10;
      var colcnt=new Array();
      for(var k=0;k<rn;k++){
      colcnt[k]=0;
      }
      for(i=rn-1;i>1;i--){//从倒数第一行开始往上检查   
      if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
      {//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。   
      rowspann+=thistab.rows[i].cells[m].rowSpan;  
    colcnt[i]++;  
      thistab.rows[i].deleteCell(m);  
      }else {   
      thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
      rowspann=0;   
      }   
      }   
     }  
    uniteTable4(document.getElementById("table1"));
     </SCRIPT>
    <SCRIPT>
    function uniteTable3(thistab,colLength){   
      var rn=thistab.rows.length;//取得行数
     // alert("当前共有"+rn)
      var rowspann=0;   
      var j = 3;
      var m = 9;
      var colcnt=new Array();
      for(var k=0;k<rn;k++) {
      colcnt[k]=0;
      }
      for(i=rn-1;i>1;i--) {//从倒数第一行开始往上检查   
      if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
      {//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。   
      rowspann+=thistab.rows[i].cells[m].rowSpan;  
    colcnt[i]++;  
      thistab.rows[i].deleteCell(m);  
      }else {   
      thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
      rowspann=0;   
      }   
      }
    }  
    uniteTable3(document.getElementById("table1"));
     </SCRIPT>
    <SCRIPT>
    function uniteTable2(thistab){   
      var rn=thistab.rows.length;//取得行数
     // alert("当前共有"+rn)
      var rowspann=0;   
      var j = 3;
      var m = 8;
      var colcnt=new Array();
      for(var k=0;k<rn;k++) {
      colcnt[k]=0;
      }
      for(i=rn-1;i>1;i--) {//从倒数第一行开始往上检查   
      if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
      {//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。   
      rowspann+=thistab.rows[i].cells[m].rowSpan;  
    colcnt[i]++;  
      thistab.rows[i].deleteCell(m);  
      }else {   
      thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
      rowspann=0;   
      }   
      }
    }  
    uniteTable2(document.getElementById("table1"));
     </SCRIPT>
    <SCRIPT>
    function uniteTable1(thistab){   
      var rn=thistab.rows.length;//取得行数
     // alert("当前共有"+rn)
      var rowspann=0;   
      var j = 3;
      var colcnt=new Array();
      for(var k=0;k<rn;k++) {
      colcnt[k]=0;
      }
      for(i=rn-1;i>1;i--) {//从倒数第一行开始往上检查   
      if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
      {//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。   
      rowspann+=thistab.rows[i].cells[j].rowSpan;  
    colcnt[i]++;  
      thistab.rows[i].deleteCell(j);  
      }else {   
      thistab.rows[i].cells[j].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
      rowspann=0;   
      }   
      }
    }  
    uniteTable1(document.getElementById("table1"));
     </SCRIPT>
    <SCRIPT>
    function uniteTable(thistab){   
      var rn=thistab.rows.length;//取得行数
      var rowspann=0;   
      var j = 2;
      var colcnt=new Array();
      for(var k=0;k<rn;k++){
      colcnt[k]=0;
      }
      for(i=rn-1;i>1;i--){//从倒数第一行开始往上检查   
      if(thistab.rows[i].cells[j].innerHTML==thistab.rows[i-1].cells[j].innerHTML && thistab.rows[i].cells[j].colSpan==thistab.rows[i-1].cells[j].colSpan)
      {//与上面一行比较,如果两行相等就合计当前行的合并行数,并删除当前行。   
      rowspann+=thistab.rows[i].cells[j].rowSpan;  
    colcnt[i]++;  
      thistab.rows[i].deleteCell(j);  
      }else {   
      thistab.rows[i].cells[j].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
      rowspann=0;   
      }   
      }   
     }  
    uniteTable(document.getElementById("table1"));
     </SCRIPT>
    <SCRIPT language=JavaScript>
    var tab = document.getElementById("table1");
    var pre;
    function count(inp){
        var td = inp.parentElement;
        var tr = inp.parentElement.parentElement;
        for (var i=tr.rowIndex; i>1; i--) //从填写数值的行往表头方向查找
        {
            if (tab.rows[i].cells.length >= tab.rows(1).cells.length-5) //找到B栏显示的那一行(即有rowspan=""的td所在的tr)
            {
                var dayTD = tab.rows[i].cells[tab.rows[i].cells.length - 4]; //因不能判定前方的列是否发生过合并,所以从后方向前找到合计单元格(倒数第4格)
    pre = isNaN(parseInt(pre,10) ) ? 0 : parseInt(pre,10);
    var oldT = isNaN( parseInt(dayTD.innerHTML,10) ) ? 0 : parseInt(dayTD.innerHTML,10);
    var num = isNaN( parseInt(inp.value,10) ) ? 0 : parseInt(inp.value,10);
    //alert(oldT+" + "+num+" - "+pre)
                dayTD.innerHTML = oldT + num - pre;
                break;
            }
        }
    }
    </SCRIPT>
      

  9.   


    谢谢zyzy15,你的找个方法,我试了下,也可以,好强啊!现在问题也解决了,谢谢各位朋友了!