2013-05-29 14 views
5

Satırların bazı hücrelerini düzenlenemez hale getirmek istiyorum. Şimdiye kadar benim çözüm, bir sütun okudum zaman, sadece bir TextCell yapmak, değilse, ben varsayılan olarak CellTextCell, DatePickerCell, vb olabilir.GWT CellTable Hücreler readOnly/disabled/non-editable

Buradaki sorun, bazı satırları salt okunur yapamıyorum ve diğerleri değil. Ya da TÜM OKULLAR VEYA YAZILARIYOR. |
Data1:

Nasıl örnek

TABLO için bu için ne yapabilirim Data2 | Data3
--------------------------------------
readOnly | non-readOnly | readOnly
readOnly | readOnly | olmayan salt okunur

i "salt okunur" o "etkin" ya ben zaten cutom hücreyi oluşturup TextImputCell yerine çalıştı, bir "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(); 
           } 
        }); 

bunu yapmak, ama olabilir demek yöntemleri asla tetik

celda = new FabriCel(); 

ve ayrıca

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

bu

@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); 
    } 

} 

Teşekkürler!

cevap

3

Tek bir özel hücre oluşturmanız gerekir. Bu şekilde, çalışma zamanını salt okunur veya okunmamış olması gerektiği gibi anlatın. sadece örnek.

verilen fasulye ise
 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); 


         } 

       } 
      } 

, salt okunur yapılması veya salt okunur diyor bazı koşul yoktur. Bunu yapmanın bir yolu

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

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

     } 
    }; 
+0

özel hücre oluşturmak zorunda . ve "EditTextCell" doğrudan örneğini koymak yerine, bazı kod koydunuz özel cell.can eklemek zorunda? – iMBMT

+0

Bazı kodları ekledim, hiç tetiklemez. – fguespe

+0

Eğer yanılmıyorsam, kod yazarken ihtiyacım bununla eşleşiyor. Neden EditTextCell yerine 'TextInputCell' kullanıyorsunuz?anlamıyorum ki. ne zaman "onBrowserEvent"/"render" i çağırmak istersiniz? hata ayıklama modunda çalıştırın ve hata ayıklama noktası ile kontrol edin! – iMBMT

1

gibi Ve oluşturmak sütunu Düzenlenebilir Hücre onBrowserEvent olayı geçersiz kılmak ve hücreyi düzenlenebilir değilse olayı tüketmektir.

  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

Çalışma zamanında hücrenin nasıl değiştirileceğini anlamıyorum. Tetiklemek içinBrowserEvent alamıyorum. Ayrıca, DOm öğelerini de kullanıyorum ... – fguespe

+0

Hücreye yazmaya başlarsanız, olaylar onBrowserEvent öğesinde devam eder. Her neyse, 2 cevabı karıştırdınız. – Spiff

+0

Bazı kod ekledim, hala tetiklemek için onBrowserEvent öğesinden alamıyorum. – fguespe

0

Aynı ihtiyacım vardı; ve render render, isEditing, resetFocus ve EditTextCell üzerinde düzenleme (onBrowserEvent çözümünü denemedim) üzerine çeşitli kombinasyonları test edildi.

Yalnızca geçersiz kıldığımda (düzenlenemezse bir HTML değeri göstermek için); Odağı sıfırlama hatalarım var (discussed here). ResetFocus'u geçersiz kılsam bile bu devam etti. Ben sadece, geçersiz kıldığımda, hücre tıklandığında düzenleme yapmak için yanıp söner ve ardından tekrar yanıp söner. Mükemmel çalışmış olan düzenleme geçersiz kılıyordu. Ben, sen nasıl istersen tetikleyebilir Column.getValue tarafından geçirilen değerin bir etiket ekleyerek dayalı tetikler ancak o kadar basit olduğu ortaya çıktı: Ben cevabı verilmiş gibi

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