删除记录并立即再次获取

时间:2014-05-12 15:54:23

标签: java smartgwt

我使用的是smartgwt(不是付费许可证版本),我有一个包含三个条目的listgrid。 键,值,重置。

reset-field是一个按钮,可以重置对值的任何更改,这是我奋斗的地方。 我试着像

那样简单地实现它
@Override
public void onClick(ClickEvent event)
{
    DataSource ds = this.grid.getDataSource();
    ds.removeData(record);
    ds.fetchData();
    this.grid.redraw();
}

grid是我的ListGrid并记录已被单击以重置的行。

但是这只删除了条目,如果我重新加载它就会再次出现(即使有正确的值,因为这是我的服务器在他获取删除请求时所做的事情),但我希望它在我之后立即点击按钮,然后点击一下。

我假设fetchData和重绘请求合并将完成此任务。

编辑:还有一些代码,这显示了我的ListGrid和RevertButton的构造函数,它应该删除并再次添加Record。

    private static final String REVERT_NAME = "revertField";

    public MyListGrid(final String name)
    {
        this.setDataSource(PropertyListDS.getInstance(name);

        ListGridField keyField = new ListGridField(ConfigurationDataSourceFields.PROPERTY_NAME, "Property");
        ListGridField valueField = new ListGridField(ConfigurationDataSourceFields.PROPERTY_VALUE, "Value");
        ListGridField revertField = new ListGridField(REVERT_NAME, "Revert to Default");

        valueField.setCanEdit(true);

        this.setShowRecordComponents(true);        
        this.setShowRecordComponentsByCell(true);

        this.setAutoFetchData(true);

        this.setFields(keyField, valueField, revertField);
    }

    @Override
    protected Canvas createRecordComponent(final ListGridRecord record, Integer colNum)
    {
        String fieldName = this.getFieldName(colNum);
        Canvas canvas = null;
        if ( REVERT_NAME.equals(fieldName) ) 
        {
            canvas = new RevertButton(this, record);
        }
        return canvas;
    }

    private class RevertButton extends IButton implements ClickHandler
    {
        private final MyListGrid grid;
        private final ListGridRecord record;

        public RevertButton(final MyListGrid grid, final ListGridRecord record)
        {
            super();
            this.setTitle("Revert to Default");
            this.grid = grid;
            this.record = record;
            this.addClickHandler(this);
        }

        @Override
        public void onClick(ClickEvent event)
        {
            DataSource ds = this.grid.getDataSource();
            ds.removeData(record);
            ds.fetchData();
            this.grid.redraw();
        }
    }

1 个答案:

答案 0 :(得分:2)

使用DSCallback这样做。

DataSource#removeData()是对服务器的异步调用。在从DSCallback中删除记录的服务器获得响应之后,再次重新绘制网格或再次获取数据。

DataSource dataSource = grid.getDataSource();
dataSource.removeData(record,new DSCallback() {

    @Override
    public void execute(DSResponse dsResponse, Object data, DSRequest dsRequest){
        Record[] records=dsResponse.getData();//deleted records

        grid.fetchData();//fetch data again
    }
});

请查看此帖子Removing local record from listGrid without committing

在再次获取数据之前尝试使用ListGrid#saveAllEdits()

您可以尝试使用ListGrid#removeSelectedData()从此组件中删除当前选定的记录。如果这是数据绑定网格,则记录将直接从DataSource中删除。