我正在使用GWT/GXT与GWT编辑器框架构建一个编辑器应用程序。在某些情况下,我不得不编辑日期列表。为此,我选择使用GridInlineEditing
,它工作得很好,但我也必须在gridInlineEditing中对我的DateField
进行一些格式验证。
基本上,编辑的默认行为是当CompleteEditEvent
被触发时"记录"变化,而不管验证的结果如何。因此,我试图像这样覆盖onCompleteEditHandler
方法(根据GXT论坛,这显然是唯一的方法):
public class NameValueDTMEditorWidget extends GenericEditableListView<DTM, Date> implements Editor<NameValueDTM> {
private final static DTMProperties props = GWT.create(DTMProperties.class);
ListStoreEditor<DTM> values;
@Ignore
private DateField df = new DateField();
public NameValueDTMEditorWidget(String widgetTitle) {
super(widgetTitle, new ListStore<DTM>(props.key()), props.dtm());
DateTimeFormat dtf = DateTimeFormat.getFormat("yyyyMMddHHmmss");
df.setPropertyEditor(new DateTimePropertyEditor(dtf));
addEditorConfig(df); // parent class method basically doing: editing.addEditor(df), editing is GridInlineEditing
// Modifying grid cell render for a Date
Cell c = new DateCell(DateTimeFormat.getFormat("yyyy-MM-dd HH:mm:ss"));
getColumnModel().getColumn(0).setCell(c);
values = new ListStoreEditor<DTM>(getStore());
editing.addCompleteEditHandler(new CompleteEditEvent.CompleteEditHandler<DTM>() {
@Override
public void onCompleteEdit(CompleteEditEvent<DTM> event) {
df.validate(); // I force field validation
if (df.getValue() == null || !df.isValid()) { // if value's not valid
getStore().clear(); // clear the store
DTM e = GWT.create(DTM.class);
getStore().add(e); // add a new value
editing.startEditing(event.getEditCell()); // start editing new value
df.forceInvalid(); // force invalid to get invilid display on the field
}
}
});
}
它几乎是我想要的,当值无效时,它留在版本中,但是当我在错误的值之后输入一个有效值时,它知道值是有效的,但它不退出版本模式。我也试图做同样的事情保持错误的输入值,而不是清除我的商店和创建一个新的值,它的行为完全相同的方式,除了用这个方法,我也有一个显示问题。
有人知道怎么做吗?我也有同样的问题与String
的列表
尝试使用Converter
editing.addEditor(columnConfig, new Converter<String, Date>() {
@Override
public String convertFieldValue(Date date) { /* called when you leave the cell */
GridCell cell = (GridCell) editing.getActiveCell();
ListStore<DTM> store = grid.getStore();
DTM dtm = store.get(cell.getRow());
/*
* here you have the dtm object belongs to related cell and the date as input.
* done with your validation here.
*/
return dtf.format(date);
}
@Override
public Date convertModelValue(String date) { /* called when you focus in the cell */
return dtf.parse(date);
}
}, df);
在验证字段之前尝试调用Field#clearInvalid
(我认为这将在您的示例中的df.validate();
行之前完成)。