weixin_42349640
2009-11-25 17:47 阅读 277

Ext.grid.GridPanel重用的问题

创建了一个grid,希望能够在两个不同的地方重用,第一个地方是放在content-panel,第二个地是放在window中,代码如下:
[code="js"]
//创建grid
var grid1 = new Ext.grid.GridPanel({
id: 'grid1',
store: store1,
tbar: [
'搜索: ', ' ',
new Ext.app.SearchField({
width:240,
store: store1,
paramName: 'q'
})
],
columns: [
{header: "id", width: 120, hidden: true, dataIndex: 'id'},
{header: "业务系统名称", width: 120, sortable: true, dataIndex: 'systemName'},
{header: "业务功能编号", width: 120, sortable: true, dataIndex: 'functionID'},
{header: "业务功能名称", width: 120, sortable: true, dataIndex: 'functionName'}
],
sm: new Ext.grid.RowSelectionModel({
singleSelect: true,
listeners: {
rowselect: function(sm, row, rec) {
//action
}
}
}),
stripeRows: true,
height:350,
width:600,
// paging bar on the bottom
bbar: new Ext.PagingToolbar({
pageSize: 25,
store: store1,
displayInfo: true,
displayMsg: 'Displaying records {0} - {1} of {2}',
emptyMsg: "No records to display"
})
});

//在content-panel中显示grid1
Ext.getCmp('content-panel').add(grid1);
Ext.getCmp('content-panel').layout.setActiveItem('grid1');
grid1.store.load();

//在window中显示grid1
function showGrid1Window() {
if(!win){
win = new Ext.Window({
layout:'fit',
width:700,
closeAction:'hide',
plain: true,
items: grid1,

        buttons: [{
            text: 'Close',
            handler: function(){
                win.hide();
            }
        }]
    });
}
grid1.store.reload();
//grid1.show();
win.show();

}
[/code]
现在遇到了两个问题:
1、在content-panel中显示grid1后显示别的内容,grid1变为隐藏,这时再调用在window中显示grid1,grid1就无法显示,即使调用grid1.show()也没有用,怎么解决?
2、我希望能够在两个地方rowselect时有不同的处理,如何能够做到?即使我用最笨的办法,用同样的代码生成一个grid2,两个共用store1,只是rowselect中的处理不一样,但只要调用过一次grid1,那么grid2的rowselect也会变成跟grid1一样,不知是什么原因?
[b]问题补充:[/b]
能解释一下为什么吗?
代码有这样一句:Ext.getCmp('content-panel').layout.setActiveItem('grid1');,去掉后会报错的
[b]问题补充:[/b]
第一个问题明白了,非常感谢
我刚才用了两个grid试了一下,发现第二个问题描述的不准确。操作是这样的:
显示grid1 -> 选择某一行(触发rowselect) -> 显示另外一个组件(隐藏grid1) -> 在window中显示grid2。
这时出现一个问题,grid1的rowselect自动被触发了,而且就是我刚才选的那行。两个grid的sm是分别定义的,请问是怎么回事?
[b]问题补充:[/b]
找到原因了,是因为共用了store,只要一reload就会触发grid1上次的rowselect,但实在想不明白,谁能解释一下?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    CaiHuajiang CaiHuajiang 2009-11-25 18:33

    原因是这个是用来显示的组件,是不能共用的,因为你只能用于生成放到一个地方的DOM。所以可以定义两个grid,共用store,共用cm,共用sm,但是还是需要两个grid。
    明白地说,grid最终所属的el,你总不至于有两个吧

    点赞 评论 复制链接分享
  • CaiHuajiang CaiHuajiang 2009-11-25 18:14

    将grid中的id: 'grid1',去掉

    点赞 评论 复制链接分享
  • weixin_42519095 weixin_42519095 2009-11-26 17:10

    load后他会默认指向第一条数据,所以触发事件

    点赞 评论 复制链接分享

相关推荐