2013-05-29 58 views
5

我想讓這些行的某些單元格是不可編輯的。 現在我的解決方案是當我創建的列,如果一個只讀,y做一個TextCell,如果沒有,我去默認單元格可以是EditTextCell,DatePickerCell等。GWT CellTable Cells readOnly/disabled/non-editable

與此問題是,我不能讓一些行只讀和其他人不。或者他們都是隻讀的字段,或者他們不是。

我該怎麼做才能讓這個例如

表:
數據1 | Data2 | Data3
--------------------------------------
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(); 
           } 
        }); 

我試着已經創建我對自定義電池和更換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); 
    } 

} 

謝謝!

回答

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(); 

     } 
    }; 
+0

當我給出的答案則必須創建自定義單元格。而不是把'EditTextCell'的直接實例,你必須添加自定義cell.can你把一些代碼? – iMBMT

+0

我添加了一些代碼,渲染從不觸發。 – fguespe

+0

如果我沒有錯,那麼我發佈的代碼與您的需求匹配。你爲什麼使用'TextInputCell'而不是'EditTextCell'?我不明白。你想什麼時候調用'onBrowserEvent' /'render'?在調試模式下運行,並檢查調試點! – iMBMT

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); 
        } 
       } 
} 
+0

我不明白如何在運行時更改單元格。我無法通過瀏覽器觸發事件​​。我也沒有使用DOm元素... – fguespe

+0

如果您開始在單元格上鍵入事件將在onBrowserEvent上。無論如何,你已經混合了2個答案。 – Spiff

+0

我添加了一些代碼,仍然無法獲取onBrowserEvent觸發。 – fguespe

0

我有同樣的需要;並測試了覆蓋渲染,isEditing,resetFocus和編輯EditTextCell(我沒有嘗試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); 
     } 
    } 
    }