我有一个简单的表,我使用IndexedContainer作为数据源来呈现一些数据。 我希望我的用户能够编辑这些数据,因此我使用TableFieldFactory(DefaultFieldFactory)来生成这些可编辑的列(属性)。
现在,如果用户处于编辑模式(table.setEditable(true))并且一直在更改某些字段,他或她应该能够丢弃这些更改 - 为此,我有一个“取消”按钮。这个“取消”按钮应该放弃表格生成的字段中所做的所有更改,因为用户进入了编辑模式,然后是setEditable(false) - 现在一切都应该是调用setEditable(true)之前的方式。
这听起来并不是很难,直到我尝试实施它。
如果我正确理解Table vs. Container与TableFieldFactory的功能,则会发生以下情况:
问题:当我按下“取消”按钮时,我该怎么做discard()?我不能做table.discard(),因为更改已经发生了。我不能做container.discard()因为,是的,Container接口不会继承该方法。我不能做field.discard(),因为我无法从createField()方法外部到达字段。
我尝试过setBuffered,markAsDirty,refreshRowCache和setImmediate的不同变体而没有成功。
这是(希望所有)相关代码:
表格,容器和“取消”按钮(大致):
table.setContainerDataSource(container);
Button cancel = new Button("Cancel", new Button.ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
// table.setImmediate(false); //tried variations of this
// table.refreshRowCache(); //tried variations of this
// table.markAsDirty(); //tried variations of this
// table.setBuffered(true); //tried variations of this
// table.discard(); //tried this, but here it's too late
table.setEditable(false);
}
});
TableFieldFactory:
table.setTableFieldFactory(new DefaultFieldFactory() {
private static final long serialVersionUID = 1L;
@Override
public Field<?> createField(Container container, Object itemId, Object propertyId, com.vaadin.ui.Component uiContext) {
TextField tField = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, uiContext);
tField.setImmediate(true);
if (propertyId.equals("Foo")) {
// field.setImmediate(true); //tried variations of this
// field.setBuffered(false); //tried variations of this
return tField;
}
else {
tField.setReadOnly(true);
}
return tField;
}
});
答案 0 :(得分:1)
通过跟踪工厂中创建的字段(并缓冲这些字段),您可以根据需要提交/放弃。
我在this self-contained GitHub Gist中创建了一个简单的缓冲表编辑示例。选择一行,然后单击编辑(或双击)。进行更改,然后单击Save / Hit Enter提交,或单击Cancel / Escape以放弃。
我故意只编辑了一行一次,因为坦率地说这是对我来说唯一有意义的事情。显然,这很容易改变。