liuxuehua12 发表于 2013-2-5 09:06:16

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

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 enablevar 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;      // check if the checkbox column header was clickedif (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, visibleRows+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;      }         }-*/;

附:smartGWT GridPager分页组件
页: [1]
查看完整版本: 解决smartGWT GridPager分页组件复选框不能全选问题