We run our application with SmartGWT 2.1 LGPL (additionaly this issue was tested in our company with 2.3 Power). We tested it with Firefox 3.6.11 and IE 8.
We use a ListGrid with a custom datasource connected to a MySQL database.
For easily editing a boolean value, we add two buttons (OK/NOT) to the grid by overriding createRecordComponent.
We add a HStack to the column and put two buttons inside.
There are some issues with the grid (especially the custom component) on rendering: The buttons that are on the viewport (and also some rows beneath) are rendered correctly. When the user scrolls the grid, then buttons are not shown at all beginning at a certain row until the end of the grid (please see attached screenshot).
We have also some buttons to change the datasource and force a invalidateCache() and fetchData() again on the grid. When performing this action, the custom buttons on the grid are (almost always) not rendered at all for all rows.
Strangely, when clicking on a grid header so sort this column, all buttons appear correctly.
Please see a test case and screenshot attached. The records for the datasource are statically generated for the test case.
Test.java:
TestDS.java:
We use a ListGrid with a custom datasource connected to a MySQL database.
For easily editing a boolean value, we add two buttons (OK/NOT) to the grid by overriding createRecordComponent.
We add a HStack to the column and put two buttons inside.
There are some issues with the grid (especially the custom component) on rendering: The buttons that are on the viewport (and also some rows beneath) are rendered correctly. When the user scrolls the grid, then buttons are not shown at all beginning at a certain row until the end of the grid (please see attached screenshot).
We have also some buttons to change the datasource and force a invalidateCache() and fetchData() again on the grid. When performing this action, the custom buttons on the grid are (almost always) not rendered at all for all rows.
Strangely, when clicking on a grid header so sort this column, all buttons appear correctly.
Please see a test case and screenshot attached. The records for the datasource are statically generated for the test case.
Test.java:
Code:
package test; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.ui.RootPanel; import com.smartgwt.client.widgets.Button; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.layout.HStack; import com.smartgwt.client.widgets.layout.VStack; public class Test implements EntryPoint { public void onModuleLoad() { Canvas canvas = new Canvas(); VStack l = new VStack(); TestDS testDS = new TestDS(); final ListGridField[] gridFields = new ListGridField[3]; gridFields[0] = new ListGridField(TestDS.FIELD_NAME_KEY); gridFields[1] = new ListGridField(TestDS.FIELD_NAME_VALUE); gridFields[2] = new ListGridField(TestDS.FIELD_NAME_STATUS); final ListGrid grid = new ListGrid() { @Override protected Canvas createRecordComponent(final ListGridRecord record, final Integer colNum) { String fieldName = this.getFieldName(colNum); if (fieldName.equals(TestDS.FIELD_NAME_STATUS)) { HStack buttonStack = new HStack(); buttonStack.setHeight(25); final Button ok = new Button("OK"); ok.setWidth(40); ok.setHeight(25); final Button not = new Button("NOT"); not.setWidth(40); not.setHeight(25); ok.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { ok.disable(); not.enable(); setEditValue(getRecordIndex(record), colNum, true); } }); not.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { ok.enable(); not.disable(); setEditValue(getRecordIndex(record), colNum, false); } }); if (record.getAttributeAsBoolean(TestDS.FIELD_NAME_STATUS)) { ok.setDisabled(true); not.setDisabled(false); } else { ok.setDisabled(false); not.setDisabled(true); } buttonStack.addMember(ok); buttonStack.addMember(not); return buttonStack; } return null; } }; grid.setWidth(500); grid.setHeight(300); grid.setShowRecordComponents(true); grid.setShowRecordComponentsByCell(true); grid.setShowAllRecords(true); grid.setDataSource(testDS); grid.setAutoFetchData(false); grid.setFields(gridFields); grid.setCellHeight(60); l.addMember(grid); Button button = new Button("Refresh"); button.addClickHandler(new ClickHandler() { public void onClick(ClickEvent event) { grid.invalidateCache(); grid.fetchData(); } }); l.addMember(button); canvas.addChild(l); canvas.draw(); grid.fetchData(); } }
Code:
package test; import com.google.gwt.user.client.Random; import com.smartgwt.client.data.DSRequest; import com.smartgwt.client.data.DSResponse; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.data.Record; import com.smartgwt.client.data.fields.DataSourceBooleanField; import com.smartgwt.client.data.fields.DataSourceTextField; import com.smartgwt.client.types.DSDataFormat; import com.smartgwt.client.types.DSProtocol; import com.smartgwt.client.widgets.grid.ListGridRecord; public class TestDS extends DataSource { public static final String FIELD_NAME_RESOURCE_KEY = "skey"; public static final String FIELD_NAME_VALUE = "svalue"; public static final String FIELD_NAME_STATUS = "bstatus"; public TestDS() { setDataProtocol(DSProtocol.CLIENTCUSTOM); setDataFormat(DSDataFormat.CUSTOM); setClientOnly(false); setAttribute("requiresAuthentication", true, false); DataSourceTextField key = new DataSourceTextField(FIELD_NAME_RESOURCE_KEY, "Key"); key.setCanEdit(false); DataSourceTextField value = new DataSourceTextField(FIELD_NAME_VALUE, "Value"); value.setCanEdit(true); DataSourceBooleanField status = new DataSourceBooleanField(FIELD_NAME_STATUS, "Status"); status.setCanEdit(true); setFields(key, value, status); } @Override protected Object transformRequest(DSRequest request) { String requestId = request.getRequestId(); DSResponse response = new DSResponse(); response.setAttribute("clientContext", request.getAttributeAsObject("clientContext")); response.setStatus(DSResponse.STATUS_FAILURE); switch (request.getOperationType()) { case FETCH: getTestRecords(requestId, response); break; default: break; } return request.getData(); } private void getTestRecords(String requestId, DSResponse response) { Record data[] = new Record[100]; for (int i=0; i<100; i++) { data[i] = new ListGridRecord(); data[i].setAttribute(FIELD_NAME_RESOURCE_KEY, "Key " + (i+1)); data[i].setAttribute(FIELD_NAME_VALUE, "Value " + (i+1)); data[i].setAttribute(FIELD_NAME_STATUS, Random.nextBoolean()); } response.setStatus(DSResponse.STATUS_SUCCESS); response.setData(data); this.processResponse(requestId, response); } }
Comment