I have a DataSource backed ListGrid.
I override createRecordComponent () to render a cell as a button.
When the I add the first record via dataSource.addData (), the record is added to the ListGrid, but createRecordComponent () is not called, and no button appears in my cell.
When I add the second record via dataSource.addData (), the record is added to the ListGrid, and createRecordComponent () is called twice, and now both records show the button.
When I added record #3, createRecordComponent () is called 3 times, and all records show the button.
See provided sample and output (Dev Console output section below), showing this.
Is there something I can do to make this work, or should I open this as a bug?
Be sure your post includes:
1. the SmartGWT or SmartClient version and browser version(s) involved;
GWT 2.0.3 / SmartGWT 2.1
GWT 2.0.3 / SmartGWT 2.3 build 1397
Google Chrome 6.0.472.59 beta and IE 6.0.2900.5512
2. for a server-side problem, the complete logs generated during processing of the request;
N/A
3. for a client-side problem, the contents of the Developer Console (see FAQ for usage);
Dev Console output
4. if there is a JavaScript error, the stack trace logged in the Developer Console (from Internet Explorer if possible); and
5. sample code.
Posts with incomplete information are much more likely to be ignored.
I override createRecordComponent () to render a cell as a button.
When the I add the first record via dataSource.addData (), the record is added to the ListGrid, but createRecordComponent () is not called, and no button appears in my cell.
When I add the second record via dataSource.addData (), the record is added to the ListGrid, and createRecordComponent () is called twice, and now both records show the button.
When I added record #3, createRecordComponent () is called 3 times, and all records show the button.
See provided sample and output (Dev Console output section below), showing this.
Is there something I can do to make this work, or should I open this as a bug?
Be sure your post includes:
1. the SmartGWT or SmartClient version and browser version(s) involved;
GWT 2.0.3 / SmartGWT 2.1
GWT 2.0.3 / SmartGWT 2.3 build 1397
Google Chrome 6.0.472.59 beta and IE 6.0.2900.5512
2. for a server-side problem, the complete logs generated during processing of the request;
N/A
3. for a client-side problem, the contents of the Developer Console (see FAQ for usage);
Code:
17:51:37.853:INFO:Log:initialized 17:51:37.869:WARN:Page:NOTE: isc.Page.getWidth() called before <BODY> tag was written out -- value cannot be determined. Returning 500 17:51:37.869:WARN:Page:NOTE: isc.Page.getHeight() called before <BODY> tag was written out -- value cannot be determined. Returning 500 17:51:38.072:WARN:AutoObserver:Use addInterfaceProperties() to add methods to interface [Class AutoObserver] 17:51:38.400:INFO:Log:isc.Page is loaded
Code:
02:23:51.984 [INFO] Loading module portal 02:23:57.219 [INFO] Module portal has been loaded 02:24:03.281 [INFO] Add Record button pressed: adding record #1 02:24:06.422 [INFO] Add Record button pressed: adding record #2 02:24:06.500 [INFO] createRecordComponent (colNum: 0): fieldName: name 02:24:06.516 [INFO] createRecordComponent (colNum: 1): fieldName: button 02:24:06.609 [INFO] createRecordComponent (colNum: 0): fieldName: name 02:24:06.625 [INFO] createRecordComponent (colNum: 1): fieldName: button 02:24:09.625 [INFO] Add Record button pressed: adding record #3 02:24:09.734 [INFO] createRecordComponent (colNum: 0): fieldName: name 02:24:09.750 [INFO] createRecordComponent (colNum: 1): fieldName: button 02:24:09.812 [INFO] createRecordComponent (colNum: 0): fieldName: name 02:24:09.828 [INFO] createRecordComponent (colNum: 1): fieldName: button 02:24:09.891 [INFO] createRecordComponent (colNum: 0): fieldName: name 02:24:09.906 [INFO] createRecordComponent (colNum: 1): fieldName: button
5. sample code.
Code:
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.Canvas; import com.smartgwt.client.widgets.IButton; import com.smartgwt.client.widgets.layout.VLayout; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.data.fields.DataSourceImageField; import com.smartgwt.client.data.fields.DataSourceTextField; import com.smartgwt.client.data.SortSpecifier; import com.smartgwt.client.data.Record; import com.smartgwt.client.data.DataSource; import com.smartgwt.client.types.Autofit; import com.smartgwt.client.types.SortDirection; import com.smartgwt.client.util.SC; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; /** * */ public class TestListGridCreateRecordComponent implements EntryPoint { // my classes public static class MyListGrid extends ListGrid { // my constants private static interface FieldName { String ID = "id"; String NAME = "name"; String BUTTON = "button"; } // my classes private static class DataGridDataSource extends DataSource { DataGridDataSource () { // mark as client only or we get exceptions indicating the server is missing setClientOnly (true); // create fields final DataSourceTextField addressField = new DataSourceTextField (FieldName.ID); addressField.setPrimaryKey (true); addressField.setRequired (true); addField (addressField); addField (new DataSourceTextField (FieldName.NAME)); addField (new DataSourceImageField (FieldName.BUTTON)); } } // my variables private final DataGridDataSource dataSource = new DataGridDataSource (); /** * Initializes this control */ public void initialize () { // initialize setShowAllRecords (true); setAutoFetchData (true); setCanEdit (false); setAutoFitData (Autofit.BOTH); setCanSort (true); setCanGroupBy (false); setShowRecordComponents (true); // required to render button setShowRecordComponentsByCell (true); // required to render button setSort (new SortSpecifier[] { new SortSpecifier (FieldName.NAME, SortDirection.ASCENDING)}); // setup datasource setDataSource (dataSource); // add fields with reasonable widths final ListGridField nameField = new ListGridField (FieldName.NAME, "Name", 150); final ListGridField buttonField = new ListGridField (FieldName.BUTTON, "Button", 40); setFields (nameField, buttonField); } /** * Adds the given Record * @param id * @param name */ public void addRecord ( final int id, final String name) { // objectify final Record record = new ListGridRecord (); record.setAttribute (FieldName.ID, id); record.setAttribute (FieldName.NAME, name); // delegate dataSource.addData (record); } /** * The ListGrid interface: overridden to render the connection buttons * @param record * @param colNum * @return Canvas */ @Override protected Canvas createRecordComponent ( final ListGridRecord record, final Integer colNum) { // fieldName-specific processing final String fieldName = getFieldName (colNum); GWT.log ("createRecordComponent (colNum: " + colNum + "): fieldName: " + fieldName); if (fieldName.equals (FieldName.BUTTON)) { // add a button final IButton button = new IButton (); button.setHeight (18); button.setWidth (24); button.setIcon ("images/action_stop.gif"); button.setTitle (""); button.addClickHandler (new ClickHandler () { public void onClick (final ClickEvent event) { // delegate SC.say ("Hello!"); } }); return button; } // no control to set -- note that neither the documentation nor the samples indicate whether // we should return null or super.createRecordComponent ()! return null; } } /** * The EntryPoint interface */ public void onModuleLoad () { // show the dev console immediately SC.showConsole (); // create the list grid final MyListGrid listGrid = new MyListGrid (); listGrid.initialize (); // create a button to add records final IButton addRecordButton = new IButton (); { addRecordButton.setAutoFit (true); addRecordButton.setTitle ("Add record"); addRecordButton.addClickHandler (new ClickHandler () { int nextId = 0; public void onClick (final ClickEvent event) { nextId ++; GWT.log ("Add Record button pressed: adding record #" + nextId); listGrid.addRecord (nextId, "Record #" + nextId); } }); } // display final VLayout layout = new VLayout (); layout.setWidth100 (); layout.setHeight100 (); layout.setLayoutMargin (5); layout.addMember (listGrid); layout.addMember (addRecordButton); layout.draw (); } }
Comment