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

解决方案 »

  1.   

    思路如下,不知道能不能符合要求:车数那列的输入栏:
    <input type=text  onblur="countme(this,'区域id'+'渣类ID')"/>
    每个日累计车数里面,假设:
    <td><div id = "区域id'+'渣类ID"></div></td>js里面实现计算:
    function countme(obj,div_id){
     //非空且为整数,则相加后再赋值到div中去。
      if(obj.value!=''&&isInt(obj.value){
       document.getElememtById(div_id).innerHTML=parseInt(document.getElememtById(div_id).innerHTML)+obj.value;
    }
    }
      

  2.   

    好像问题纠结在所在的车数的文本框是谁的问题,这样,你每个文本框里绑个ID值什么的,可以写在TEXT的name属性里,这样就可以重复了,虽然有点流氓……
    当计算车数的时候,找到标示值相等的文本框那就加起来,并且把值可以写入数据库到指定的ID位置。
      

  3.   


    谢谢crazylaa 给我提供的思路,我今天按照你的思路做了下,效果差不多可以实现了,就是有点小问题,因为文本框是onblur事件,只要焦点失去的时候document.getElememtById(div_id).innerHTML 就会相加,改为onchange事件也一样,因为document.getElememtById(div_id).innerHTML没有清空,但是我又不知道如何清空值,现在该成:
    if(obj.value != ""  ){
              document.getElementById(div_id).innerHTML =  document.getElementById(div_id).innerHTML - 0 + parseInt(obj.value) ;
    }
      

  4.   


    还是用onchage事件吧。
    另外上面那个思路,有个问题没有考虑到:原来的值是1,现在改为2,则总数只能加1,所以,可能还需要一个隐藏变量(假设其id为'Pre'+'区域id'+'渣类ID')来记录修改前的值(空则为0)。这样假设 
    var totalObj = document.getElememtById(div_id);
    则onchange之后,
     totalObj.innerHTML = parseInt(totalObj.innerHTML)+(obj.vale - preValue);清空的话,直接
     document.getElememtById(div_id).innerHTML='';
    即可。
      

  5.   

    还有,需要做个判断,以免parseInt出错。
    if(document.getElememtById(div_id).innerHTML=='')
     totalObj.innerHTML = obj.vale - preValue;
      

  6.   


    我说 document.getElememtById(div_id).innerHTML没有清空的意思 ,其实也就是 你说的原来的值是1,现在改为2,则总数只能加1 ,我以为清空就好了。但是发现清空后,后面的值都为null了, preValue 是怎么得到的了?是你说的 隐藏变量(假设其id为'Pre'+'区域id'+'渣类ID') 吗?但是 隐藏变量不只是个id吗?能不能麻烦综合下,帮我写个方法
      

  7.   


    你把html贴出来吧,我试试看。
      

  8.   

    楼主,我模拟了一下,表格没有画,你看看?
    存成html即可
    <html>
    <head>
    </head>
    <script>
    function countme(obj,div_id,pre_id){
      if(obj.value!=''){
      //前一个值
      var preval = document.getElementById(pre_id).value;
      //当前div值
      var t = document.getElementById(div_id+'_value').value;   //显示
      document.getElementById(div_id).innerHTML = parseInt(t) + parseInt(obj.value) - parseInt(preval);
      //赋前一个值
      document.getElementById(pre_id).value = obj.value;
      //赋当前div值
      document.getElementById(div_id+'_value').value = parseInt(t) + parseInt(obj.value) - parseInt(preval);
      
    }
    }
    </script>
    <body>
    <form>
      <table colspan="1" border="1">
      <tr>
      <td>id1aaa</td>
      <td>id2aaa</td>
      <td>textaaa</td>
      <td>totalaaa</td>
      </tr>
      <tr>
       <td>id1</td>
      <td>id2</td>
      <td><input type="hidden" id="pre_id1_id2_text1_value" value="0"/><input type="text" onchange="countme(this,'id1_id2','pre_id1_id2_text1_value');" /></td>
      <td>total</td>
      </tr>
        <tr>
       <td>id1</td>
      <td>id2</td>
      <td><input type="hidden" id="pre_id1_id2_text2_value" value="0"/><input type="text" onchange="countme(this,'id1_id2','pre_id1_id2_text2_value');" /></td>
      <td> <div id="id1_id2">0</div><input type="hidden" id="id1_id2_value" value="0"/></td>
      </tr>
        <tr>
       <td>id1</td>
      <td>id2</td>
      <td><input type="hidden" id="pre_id1_id2_text3_value" value="0"/><input type="text" onchange="countme(this,'id1_id2','pre_id1_id2_text3_value');" /></td>
      <td>total</td>
      </tr>
     </form>
    </body>
    </html>
      

  9.   

    因为是jsp动态查询出来的数据。没有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="0" 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="doCheck1(this,614615)" 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="doCheck1(this,614615)" 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="doCheck1(this,614615)" 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="doCheck1(this,614615)" 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>
      

  10.   

    上面其实就是从数据库中查询出来一条一条的数据,没有合并行,合并行最主要的是通过下面的js合并的。
    <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>
    <%-- 总合计吨位的合并 begin--%>
    <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>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[m].rowSpan; 
     colcnt[i]++; 
             thistab.rows[i].deleteCell(m); 
          }else {   
            thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
            rowspann=0;   
          }   
       }   
     } 
    uniteTable5(document.getElementById("table1"));
     </SCRIPT>
    <%-- 总合计吨位的合并 end--%> <%-- 总合计车数的合并 begin--%>
    <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>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[m].rowSpan; 
     colcnt[i]++; 
             thistab.rows[i].deleteCell(m); 
          }else {   
            thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
            rowspann=0;   
          }   
       }   
     } 
    uniteTable4(document.getElementById("table1"));
     </SCRIPT>
    <%-- 总合计车数的合并 end--%> <%-- 日累计吨位合并 begin--%>
    <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>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[m].rowSpan; 
     colcnt[i]++; 
             thistab.rows[i].deleteCell(m); 
          }else {   
            thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
            rowspann=0;   
          }   
       }

    uniteTable3(document.getElementById("table1"));
     </SCRIPT>
    <%-- 日累计吨位合并 end--%> <%-- 日累计车数合并 begin--%>
    <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>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[m].rowSpan; 
     colcnt[i]++; 
             thistab.rows[i].deleteCell(m); 
          }else {   
            thistab.rows[i].cells[m].rowSpan+=rowspann;//如果不等就完成当前相同数据的合并。
            rowspann=0;   
          }   
       }

    uniteTable2(document.getElementById("table1"));
     </SCRIPT>
    <%-- 日累计车数合并 end--%> <%-- 渣类合并 begin--%>
    <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>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;   
          }   
       }

    uniteTable1(document.getElementById("table1"));
     </SCRIPT>
    <%-- 渣类合并 end--%> <%-- 区域合并 begin--%>
    <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>