针对GridView某一列的值进行汇总:以下是一位老师的代码:
    $(document).ready(function() 
        {
                //在表的尾部添加一行,$("#<%=GridView1.ClientID %> tbody")表示GridView1在页面生成的表格,注意这里为了方便,引用了JQuery
                var tr = $("#<%=GridView1.ClientID %>  tbody")[0].insertRow(-1);
                var td;
                //按表格的列数在新插入的行里添加单元格
                for (var i = 0; i < $("#<%=GridView1.ClientID %>  tbody th").length; i++) {
                    //添加单元格
                    td = tr.insertCell(-1);
                    //在添加的单元格里插入空格
                    td.innerHTML = " ";
                }                var sumAmount = 0;
                //开始统计
                //循环GridView1的每一行
                $("#<%=GridView1.ClientID %>  tr").each(function() 
                {
                    //该行的第N个单元格(N表示我们要统计的列)
                    td = $(this).find("td").eq(3);
                    //累加访问人数
                    sumAmount += Number(td.text());
                }
                );
                //汇总出来了
                td.text("金额合计:" + sumAmount);
            });如果GridView 要汇总的这个列是:
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:TextBox ID="TextBoxTotal" runat="server" Text='<%#Eval("Total") %>'></asp:TextBox>
                </ItemTemplate>
            </asp:TemplateField>
上面的代码就无法实现,哪位老师帮我改一下,可以让我实现汇总,多谢了.

解决方案 »

  1.   

    你可以修改Ext.grid.GridView的doRender方法
    Ext.onReady(function(){
     Ext.override(Ext.grid.GridView,{
       // private
       //这个方法就是读取数据,根据template生成的grid各行数据
        doRender : function(cs, rs, ds, startRow, colCount, stripe){
            var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;
            var tstyle = 'width:'+this.getTotalWidth()+';';
            // buffers
            var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;
            for(var j = 0, len = rs.length; j < len; j++){
                r = rs[j]; cb = [];
                var rowIndex = (j+startRow);
                for(var i = 0; i < colCount; i++){
                    c = cs[i];
                    p.id = c.id;
                    p.css = i == 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
                    p.attr = p.cellAttr = "";
                    p.value = c.renderer(r.data[c.name], p, r, rowIndex, i, ds);
                    p.style = c.style;
                    if(p.value == undefined || p.value === "") p.value = "&#160;";
                    if(r.dirty && typeof r.modified[c.name] !== 'undefined'){
                        p.css += ' x-grid3-dirty-cell';
                    }
                    cb[cb.length] = ct.apply(p);
                }
                var alt = [];
                if(stripe && ((rowIndex+1) % 2 == 0)){
                    alt[0] = "x-grid3-row-alt";
                }
                if(r.dirty){
                    alt[1] = " x-grid3-dirty-row";
                }
                rp.cols = colCount;
                if(this.getRowClass){
                    alt[2] = this.getRowClass(r, rowIndex, rp, ds);
                }
                rp.alt = alt.join(" ");
                rp.cells = cb.join("");
                buf[buf.length] =  rt.apply(rp);
            }
    //...............
            buf[buf.length] = "<div>这里是统计行</div>";//这里加一行,可以读取json数据生成这一行.
    //...............
            return buf.join("");
            
        } })
    })
      

  2.   

    我晕了,看成EXT的gridview了,不好意思啊.
    普通的table不是很好操作么?
      

  3.   

    你的问题表述得不够清晰.
                        
    //该行的第N个单元格(N表示我们要统计的列)
    td = $(this).find("td").eq(3);
                        
    //累加访问人数
    sumAmount += Number(td.text()); //是不是因为td.text()是类似以下的一串html串,造成统计出错?
    /*
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:TextBox ID="TextBoxTotal" runat="server" Text='123'> </asp:TextBox>
                    </ItemTemplate>
                </asp:TemplateField> */
      

  4.   

    默认情况下使用那段js代码是可以统计出最一列的汇总值的,当我把需要汇总的那个列改为模板列,同时 ItemTemplate浏览模式下,使用TextBox显示数据,的情况下,那段JS就统计不出来了.我不知道要修改哪里才可以.
      

  5.   

    我这里自己写的一段贴出来你看看function getSelValueInDataGrid(chk_name,dataGridID,dataGridNum,chkIndex)//chk名称与要获取选择项的值列号
    {
        {//构造
            if(!chkIndex)
                chkIndex=0;
        }
        var values="";
        var trs=$(dataGridID).getElementsByTagName('tr');
        for(var dg_i=1;dg_i<trs.length;dg_i++)//从1开始,排除头部行
        {
            if(trs[dg_i].getElementsByTagName('td')[chkIndex].getElementsByTagName('input')[0].checked)
            {
                values+="'" + trs[dg_i].getElementsByTagName('td')[dataGridNum].innerText + "',";
            }
        }
    if(values!="")
    {
        values = values.substring(0,values.length-1);
    }
    return values;
    }
    //第一个参数是全选框ID,第二个似乎GridView的ID,最后一个是要统计的列所在的位置1表示第二列
    var ciNums = getSelValueInDataGrid('chkAll_grid_stat','grid_stat',1);以上是要选择框才能用的,楼主稍微改下去掉选择框的功能就能用了