有关GridPanel中的CheckboxSelectionModel(Extjs)
看到前人写的代码有不爽之处,不过改起来还真不知道从何下手,研究了一阵子,总算是搞定了。。。
我解决的问题是:在gridpanel左侧有一列checkbox,gridpanel右侧有一个图片区,每一行对应一个不同的图片。前人想偷懒,在有多行选择的时候,右侧只显示最上面一行的图片。。显然不太给力啊。。。。而且还有效率问题,当点击gridpanel标题行的全选checkbox时,右侧的信息会不停地变啊变,如果每页显示500条数据,要等好久。。。
我的目标是选择不同行的时候,右侧都显示出对应的图片。而且,全选与全不选的时候,效率还很高。。。。
开始的思路是重写表头的全选checkbox点击事件,找了好久,没找到方法。。。后来无意间看到了另一种思路,那就是对cell的click事件进行操作:
checkBox = new Ext.grid.CheckboxSelectionModel();
//checkBox.handleMouseDown = Ext.emptyFn;
///这个方法是屏蔽用户对checkbox以外的列的点击事件。因为如果已经选了2行,但对另一行点击时,前两行的选择会被取消。
///对于表头的checkbox不会进此事件
vehiclePassInfoGrid.on('cellclick', function(grid, rowIndex,columnIndex,event){
var rowArray = vehiclePassInfoGrid.getSelectionModel().getSelections();
if(rowArray.length == 0){
document.getElementById("ExportBtn").disabled = true;
}else{
document.getElementById("ExportBtn").disabled = false;
} ///这是对导出按钮的控制,只有有选择数据时,此按钮才可使用。
if (rowIndex >= 0)//判断表格的行的选中状态
{
if (checkBox.isSelected(rowIndex)) {
//alert(rowIndex);
m_selectRecord = vehiclePassInfoStore.getAt(rowIndex);
m_iFtpIndex = vehiclePassInfoStore.indexOf(m_selectRecord);
///相应操作1
}else{
m_selectRecord = null ;
///相应操作2
}
}else{
//none
}
});
//////由于全选不会进入cellclick事件,所以,导出按钮 要对它进行单独监控
vehiclePassInfoGrid.selModel.on('selectionchange', function(selModel) {
var rowArray = vehiclePassInfoGrid.getSelectionModel().getSelections();
if(rowArray.length.length == 0){
document.getElementById("ExportBtn").disabled = true;
}else{
document.getElementById("ExportBtn").disabled = false;
}
});
PS:再补充点我做此功能之前收集到的一点代码,当然后来都没怎么用。
1.
var sm = new Ext.grid.CheckboxSelectionModel();
sm.handleMouseDown = Ext.emptyFn;//不响应MouseDown事件
sm.on('rowselect',function(sm_,rowIndex,record){//行选中的时候
2.
var hd_checker = vehiclePassInfoGrid.getEl().select('div.x-grid3-hd-checker');
var hd = hd_checker.first();
//判断是否是全选/取消全选
//var record = rowArray[0];
if(hd!=null ){
if(hd.hasClass('x-grid3-hd-checker-on')){
//hd.removeClass('x-grid3-hd-checker-on');
//alert("aaa");
}else if(hd.hasClass('x-grid3-hd-checker-off')){
//alert("bbb");
}
}
3.
我相信大家都用过checkboxSelectionModel.只要点击某一行.无论任点击任何列.它都要被选中.现在我的情况就是.点了全选.如果再点击某一行.所有行都被取消了选中状态.只有那一行被选中.现在我只想实现点击复选框才有效果.点其它列无效.
我的解决方法:
var sm_item = new Ext.grid.CheckboxSelectionModel();
sm_item.handleMouseDown = Ext.emptyFn; 让sm_item的handleMouseDown失效,这是参照一个陌生大哥的博客上面的,在次谢谢他
selectUserPanel.on(cellclick, function(grid, rowIndex,columnIndex,event) {这是表格的列点击事件
if (columnIndex != 0) {
if (sm_item.isSelected(rowIndex))判断表格的行的选中状态
sm_item.deselectRow(rowIndex);设置CheckboxSelectionModel的选中行的状态
else
sm_item.selectRow(rowIndex, true);
}
})
}, this);
sm.on('rowdeselect',function(sm_,rowIndex,record){//行未选中的时候
}, this);
4.
在一个表格中使用CheckboxSelectionModel选择模型实现多行选择,但是其中有些行是不能被选择的,怎样让指定的行的checkbox不能被选择
Ext.override(Ext.grid.RowSelectionModel, {
selectRow: function(index, keepExisting, preventViewNotify) {
if (this.isLocked() || (index < 0 || index >= this.grid.store.getCount()) || (keepExisting && this.isSelected(index)) || (Number(this.grid.store.getAt(index).get("EditFlag")) === 0)) {//根据每行的一个标识字段来判断是否选中
return;
}
var r = this.grid.store.getAt(index);
if (r && this.fireEvent('beforerowselect', this, index, keepExisting, r) !== false) {
if (!keepExisting || this.singleSelect) {
this.clearSelections();
}
this.selections.add(r);
this.last = this.lastActive = index;
if (!preventViewNotify) {
this.grid.getView().onRowSelect(index);
}
this.fireEvent('rowselect', this, index, r);
this.fireEvent('selectionchange', this);
}
}
});
//在record 中添加一个标识字段就可以了。我项目中的代码
你在sotre里加一个selected列,如果要选中在后台把它设置用true
{deptname:'aa',carkindsname:'bb',selected:true}
var sm = new Ext.grid.CheckboxSelectionModel();
var cm = new Ext.grid.ColumnModel([sm, {
align : 'center',
header : "车属单位",
dataIndex : "deptname",
renderer : ZeroorNull
}, {
align : 'center',
header : "车种名",
dataIndex : "carkindsname",
renderer : ZeroorNull
}])
grid.store.on('load', function(store, records, options) {
sm.clearSelections();
Ext.each(records, function(rec) {
if (rec.get('selected')) {
sm.selectRow(grid.store.indexOfId(id),
true);
}
})
});
posted on 2011-12-06 16:52 java课程设计例子 阅读(303) 评论(0) 编辑 收藏 举报