2013-05-29 22 views
5

行の一部のセルを編集不可能にする必要があります。 これまでに私の解決策は、私が列を作成するとき、私がTextCellを作成し、そうでなければEditTextCell、DatePickerCellなどのデフォルトのCellと一緒に行く、readOnlyの場合です。GWT CellTableセル読み取り専用/無効/編集不可能

この問題は、私がreadOnlyなどのいくつかの行を作成できないことです。または、それらはすべてreadOnlyのフィールドか、そうでないフィールドです。 |
のData1:

にはどうすればいいの例

TABLEのためにこれを作るために行うことができますデータ2 |データ3
--------------------------------------
readOnly |非readOnly | readOnly
readOnly | readOnly |私は「読み取り専用」を意味するとき非読み取り専用

それは私が決してトリガーすでに私のcutom細胞を作成し、TextImputCellを交換しようとしたが、メソッド「有効」またはそれは「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(); 
           } 
        }); 

作ることができます

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

カスタムセルを1つ作成する必要があります。その中で、あなたは、読み込み専用であるか、読み込み専用でないように、ランタイムに指示します。ただの例。

 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という条件があります。 そして、これを行う方法は、あなたの編集可能なセルのonBrowserEventイベントをオーバーライドして、セルが編集可能でない場合は、イベントを消費することである

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

もし私が間違っていないなら、私はあなたの要件がそれに一致するコードを投稿します。なぜあなたは 'EditTextCell'の代わりに' TextInputCell'を使っていますか?私は理解していない。いつあなたは 'onBrowserEvent' /' render'を呼びたいのですか?デバッグモードで実行し、デバッグポイントでチェック!! – iMBMT

1

のような列を作成します。

  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

実行時にセルを変更する方法がわかりません。私はonBrowserEventをトリガーすることができません。 DOm要素も使用しています。 – fguespe

+0

セルに入力を開始すると、イベントはonBrowserEventに移動します。とにかく2つの答えが混じっています。 – Spiff

+0

私はいくつかのコードを追加し、引き続きonBrowserEventをトリガーすることはできません。 – fguespe

0

私は同じ必要性を持っていました。 EditTextCellでオーバーライドされたレンダリング、isEditing、resetFocus、editのさまざまな組み合わせをテストしました(私は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); 
     } 
    } 
    } 
関連する問題