ext 打印

[color=red]大家好,我想实现一个打印grid数据的功能,通过工具中的按钮触发打印函数。现在的问题是,我是通过grid的id来获取grid组件,然后打印,这样不利于代码共用。我现在想怎样在grid里面把这个grid的引用传给这个printGrid函数,不知道该怎么传递grid这个参数,然后这样调用printGrid(grid)[/color][size=medium][/size]
[code="java"]
var stat1_grid = new Ext.grid.GridPanel({
cm : cm,
store : store,
id:'stat1_grid',
border : false,
loadMask : {
msg : '正在加载数据,请稍后...'
},
bbar : [{
xtype : 'button',
iconCls : 'pdf-icon',
text : '导出'
}, '-', {
xtype : 'button',
iconCls : 'print-icon',
text : '打印',
handler:printGrid
}]
});
[/code]
[size=medium]
[color=red]这是printGrid函数[/color][/size]

[code="java"]
//打印报表
function printGrid() {

    var grid =Ext.getCmp('stat1_grid');
        var tableStr = '<table width="100%" border=1>';  
        var cm = grid.getColumnModel();  
        var colCount = cm.getColumnCount();  
        var temp_obj = new Array();  
        // 只下载没有隐藏的列(isHidden()为true表示隐藏,其他都为显示)  
        // 临时数组,存放所有当前显示列的下标  
        for (var i = 1; i < colCount; i++) {//从第三列开始,因为我的第1、2列是分别是rownumber和selectmodel。  
            if (cm.isHidden(i) == true) {  
           } else {  
               temp_obj.push(i);  
           }  
       }  

// tableStr = tableStr + '

序号';

for (var i = 0; i < temp_obj.length; i++) {

// 显示列的列标题

tableStr = tableStr + '' + cm.getColumnHeader(temp_obj[i])

+ '';

}

tableStr = tableStr + '';

var store = grid.getStore();

var recordCount = store.getCount();

for (var i = 0; i < recordCount; i++) {

var r = store.getAt(i);

// tableStr = tableStr + '' + (i + 1) + '';

for (var j = 0; j < temp_obj.length; j++) {

var dataIndex = cm.getDataIndex(temp_obj[j]);

var tdValue = r.get(dataIndex);

var rendererFunc = cm.getRenderer(temp_obj[j]);

if (rendererFunc != null) {

tdValue = rendererFunc(tdValue);

}

if (tdValue == null) {

tdValue = '';

}

tableStr = tableStr + '' + tdValue + '';

}

tableStr = tableStr + '';

}

tableStr = tableStr + '';

var titleHTML = tableStr;// document.getElementById("printGridfff").innerHTML;

var newwin = window.open('printer.jsp', '', '');
       newwin.document.write(titleHTML);  
       newwin.document.location.reload();  
       newwin.print();  
       newwin.close();  
   }  

[/code]

根据你上面写的代码,在button的handler里是可以直接获取到该grid的,那么你的代码可以稍微修改下,即:
{

xtype : 'button',

iconCls : 'print-icon',

text : '打印',

handler:function(){
printGrid(stat1_grid);
}
}

给出两种实现方法作参考
1. 利用匿名函数形成闭包封装一下
[code="js"]
var stat1_grid = new Ext.grid.GridPanel({
// ...
}, '-', {
xtype : 'button',
iconCls : 'print-icon',
text : '打印',
handler:function(){
printGrid(stat1_grid);
}
}]
});
[/code]

  1. 通过ownerCt访问 [code="js"] function printGrid(btn, e) { // Button的handler调用时会传递button引用及浏览器事件 // 这里的this默认也是指向button //var grid = btn.ownerCt.ownerCt; var grid = this.ownerCt.ownerCt; // button.ownerCt指向toolbar,toolbar.ownerCt指向panel/grid // ... } [/code]