我想让行中的某些单元格不可编辑。 到现在我的解决方案是当我创建列时,如果一个是readOnly,则创建一个TextCell,如果没有,我使用默认的Cell,可以是EditTextCell,DatePickerCell等。
这个问题是我不能把一些行readOnly而其他行没有。或者他们是所有字段只读或不是。
我该怎么做呢?例如
TABLE:
Data1 | Data2 |数据3
--------------------------------------
readOnly | non-readOnly | readOnly的
readOnly | readOnly |非readOnly的
当我的意思是“readOnly”时,它可以“启用”或使其成为“TextCell”
celda = new TextInputCell();
Column<ObjetoDato, String> columna = new Column<ObjetoDato, String>(celda) {
@Override
public String getValue(ObjetoDato object) {
if(actual.getValorDefault()!=null && object.getValor(actual.getNombreCampo()).isEmpty()){
object.setValor(actual.getNombreCampo(), actual.getValorDefault());
return actual.getValorDefault();
}
return object.getValor(actual.getNombreCampo());
}
};
tabla.agregarColumna(columna, actual.getCaption());
columna.setFieldUpdater(new FieldUpdater<ObjetoDato, String>() {
@Override
public void update(int index, ObjetoDato object, String value) {
object.setValor(actual.getNombreCampo(), value);
new Scripter(object,actual.getComportamiento(),true);
tabla.actualizar();
Sistema.get().getIG().actualizarTotales();
}
});
我已经尝试创建我的cutom单元并替换TextImputCell,但方法永远不会触发
celda = new FabriCel();
和
public class FabriCel extends TextInputCell {
private String campo;
public FabriCel(String campo){
this.campo=campo;
}
@Override
public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater){
Boolean editable = false;///get it from your model
if(editable != null && !editable){
event.preventDefault();
}else{
super.onBrowserEvent(context, parent, value, event, valueUpdater);
}
}
也是这个
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, String value, SafeHtmlBuilder sb) {
Boolean editable = false;///get it from your model
if(editable){
Log.log();
sb.appendHtmlConstant("<div contentEditable='false'>" +value+"</div>");
}else{
Log.log("No entra");
super.render(context, value, sb);
}
}
谢谢!
答案 0 :(得分:3)
您必须创建一个自定义单元格。在那里,你告诉运行时它应该是readonly或no-readonly。只是一个例子。
private class CustomCell extends EditTextCell {
public void render(com.google.gwt.cell.client.Cell.Context context,
String value, SafeHtmlBuilder sb) {
Data data=context.getKey();
if(data.isReadOnly()){
sb.appendHtmlConstant("<div contentEditable='false'
unselectable='false' >" +value+"</div>");
}else{
super.render(context, value, sb);
}
}
}
在给定的bean中,有一些条件是readonly或no-readonly。 并创建像
这样的列Column<Data, String> nameColumn = new Column<Data, String>(new CustomCell()) {
@Override
public String getValue(Data object) {
return object.getName();
}
};
答案 1 :(得分:1)
执行此操作的方法是覆盖可编辑单元格的onBrowserEvent事件,并在单元格不可编辑时使用该事件。
final EditTextCell cell = new EditTextCell(renderer)
{
@Override
public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater)
{
Boolean editable = false;///get it from your model
if(editable != null && !editable)
{
event.preventDefault();
}
else
{
super.onBrowserEvent(context, parent, value, event, valueUpdater);
}
}
}
答案 2 :(得分:0)
我有同样的需要;并在EditTextCell上测试了覆盖渲染,isEditing,resetFocus和编辑的各种组合(我没有尝试onBrowserEvent解决方案)。
当我只覆盖渲染时(如果不可编辑则显示HTML值);我在重置焦点时遇到错误(discussed here)。即使我重写了resetFocus,这仍然继续。当我只覆盖isEditing时,单击时单元格将闪烁编辑,然后闪回。完美的工作是覆盖编辑。我在基于为Column.getValue传入的值添加标记时触发,你可以触发但是你喜欢,但事实证明它很简单:
private static class LockableEditTextCell extends EditTextCell {
@Override
protected void edit(Context context, Element parent, java.lang.String value) {
if (!value.startsWith(LOCKED_CELL_VALUE)) {
super.edit(context, parent, value);
}
}
}