解决GridPager分页组件复选框不能全选问题

来源:互联网 发布:南京大学软件学院 校区 编辑:程序博客网 时间:2024/06/12 04:37

GridPager分页组件在ListGrid 配置了

setSelectionType(SelectionStyle.SIMPLE);

setSelectionAppearance(SelectionAppearance.CHECKBOX)

后会出现 “Can't select that many records at once”提示,并不能全选。

 

解决思路:去掉提示,将选择grid中所有记录替换为选择所有可见的记录。

 

实现:

第一步: 在GridPager中为ListGrid的DataArrived事件添加去掉提示代码覆盖SmartClient的代码(因为SmartClient是在数据到达后就设置提示,并将checkBoxField设为不可用)。代码如下:

/**

* 自定义ListGrid的CheckBoxField属性,覆盖SmartGWT的范围太大不能提示
     * 需要在ListGrid的DataArrivedHandler事件处理中调用
     *
     * @param grid 要更改的ListGrid对象
     */

public native void changeCheckBoxFieldProperty(ListGrid grid)/*-{
        var self = grid.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
        if (self.getCurrentCheckboxField()) {      
            var cbPos = self.getCheckboxFieldPosition(),falseImage = self.checkboxFieldFalseImage ||    self.booleanFalseImage;
            // remove selectionRangeNotLoadedMessage(Can't select that many records at once) prompt
            // checkbox is enable

var props = {
                    disabled: false,
                    showHover: false,
                    prompt: null,
                    title:  self.getValueIconHTML(falseImage, field)
                }           
             self.setFieldProperties(cbPos, props);
        }
    }-*/;

 

grid.addDataArrivedHandler(new DataArrivedHandler()
        {
            public void onDataArrived(DataArrivedEvent event)
            {
                changeCheckBoxFieldProperty(grid);//覆盖SmartGWT不能选择提示
               
                updatePagerControls(getTotalPages());
            }
        });

 

 

 

第二步: 在定义ListGrid时,自定义表单点击事件
        //自定义表头单击事件
        xxxGrid.addHeaderClickHandler(new HeaderClickHandler(){
        public void onHeaderClick(HeaderClickEvent event)
            {
            Boolean re = changeSelectRange(xxxGrid,event.getFieldNum());
           if(re != null){               
                event.cancel();
            }           
            }

});

    /**
     * javascript本地方法。 自定义checkBoxHeader选择范围为当前页面,解决默认选择所有导致出现提示"Can't select that many records at once"问题。

* @param grid 要更改CheckboxHeader选择的ListGrid对象
     * @param fieldNum checkBoxField字段位置
     * @return 如果该字段是checkBoxField则返回当前的状态,选中为true,未选为false,如果该字段不是checkBoxField,则返回null
     */

 

public native Boolean changeSelectRange(ListGrid grid ,int fieldNum)/*-{
        var self = grid.@com.smartgwt.client.widgets.BaseWidget::getOrCreateJsObj()();
        var field = self.fields[fieldNum];
        // check if the checkbox column header was clicked

if (self.isCheckboxField(field) && self.selectionType != "single" && self.canSelectAll != false) {
            if (field._allSelected) {
                self.deselectAllRecords();
                //更改checkboxHeader图标为不选中

var icon =  self.checkboxFieldFalseImage || self.booleanFalseImage,
                    title = self.getValueIconHTML(icon, field);                    
                self.setFieldTitle(fieldNum, title);
                field._allSelected=false;
            } else {

var visibleRows = self.getVisibleRows();//return visibleRows start end end point ,if no visiable return [-1,-1]
                var dataRows = self.data.getRange(visibleRows[0], visibleRows[1]+1);               
                self.selectRecords(dataRows, true);

//更改checkboxHeader图标为选中

var icon =  self.checkboxFieldTrueImage || self.booleanTrueImage,
                    title = self.getValueIconHTML(icon, field);                    
                self.setFieldTitle(fieldNum, title);
                field._allSelected=true;
            }

return @com.smartgwt.client.util.JSOHelper::toBoolean(Z)(field._allSelected);
        }else{
            //if click other header clear all selected records
             self.deselectAllRecords();
             field._allSelected=false;

return null;
        }
      
     }-*/;