5

我想让行的某些单元格不可编辑。现在我的解决方案是当我创建列时,如果一个是只读的,则制作一个 TextCell,如果不是,我使用默认的 Cell,它可以是 EditTextCell、DatePickerCell 等。

这样做的问题是我不能使某些行只读而其他行不能。或者它们都是只读的字段,或者它们不是。

例如,我该怎么做才能做到这一点

表:
数据1 | 数据2 | Data3
--------------------------
只读 | 非只读 | 只读
只读 | 只读 | 非只读

当我的意思是“只读”时,它可以“启用”或使其成为“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();
                              }
                    });  

我已经尝试创建我的自定义单元格并替换 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);
    }

}  

谢谢!

4

3 回答 3

3

您必须创建一个自定义单元格。在那,你已经告诉运行时它应该是只读的或非只读的。只是例子。

        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 中,有一些条件表示只读或非只读。并创建类似的列

Column<Data, String> nameColumn = new Column<Data, String>(new CustomCell()) {

        @Override
        public String getValue(Data object) {
            return object.getName();

        }
    };
于 2013-05-30T05:15:42.300 回答
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);
                    }
                }
}
于 2013-05-30T06:35:03.467 回答
0

我也有同样的需要;并在 EditTextCell 上测试了覆盖渲染、isEditing、resetFocus 和编辑的各种组合(我没有尝试 onBrowserEvent 解决方案)。

当我只覆盖渲染时(如果不可编辑,则显示 HTML 值);我在重置焦点时遇到错误(如此处所述)。即使我覆盖了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);
      }
    }
  }
于 2016-06-03T20:09:48.330 回答