2013-05-29 24 views
5

Tôi muốn làm cho một số ô của các hàng có thể không chỉnh sửa được. bây giờ giải pháp của tôi là khi tôi tạo ra các cột, nếu một là readOnly, y làm cho một TextCell, nếu không, tôi đi với Cell mặc định có thể được EditTextCell, DatePickerCell, vv.Tế bào GWT CellTable chỉ đọc/tắt/không thể chỉnh sửa

Vấn đề với điều này là tôi không thể làm cho một số hàng readOnly và những người khác thì không. Hoặc họ là tất cả các lĩnh vực readOnly hoặc họ không.

Làm thế nào tôi có thể làm để làm cho điều này ví dụ

TABLE:
Data1 | Dữ liệu 2 | Dữ liệu3
--------------------------------------
readOnly | không chỉ đọc | readOnly
readOnly | readOnly | phi readonly

khi tôi có nghĩa là "chỉ đọc" nó có thể được "enabled" hoặc làm cho nó một "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(); 
           } 
        }); 

tôi cố gắng tạo ra tế bào cutom tôi đã và thay thế TextImputCell, nhưng các phương pháp không bao giờ kích hoạt

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

Ngoài này

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

} 

Cảm ơn!

Trả lời

3

Bạn phải tạo một ô tùy chỉnh. Trong đó, bạn đã nói với thời gian chạy như nó phải là chỉ đọc hoặc không có chỉ đọc. chỉ là ví dụ.

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


         } 

       } 
      } 

Trong đậu nhất định, có một số điều kiện cho biết chỉ đọc hoặc không có chỉ đọc. Và tạo cột như

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

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

     } 
    }; 
+0

Như tôi đã trả lời, bạn phải tạo ô tùy chỉnh . và thay vì đặt trường hợp trực tiếp của 'EditTextCell', bạn phải thêm custom cell.can bạn đặt một số mã? – iMBMT

+0

Tôi đã thêm một số mã, hiển thị không bao giờ kích hoạt. – fguespe

+0

Nếu tôi không sai khi tôi đăng mã yêu cầu của bạn phù hợp với nó. tại sao bạn sử dụng 'TextInputCell' thay vì' EditTextCell'?cái đó? Tôi không hiểu. khi nào bạn muốn gọi 'onBrowserEvent' /' render'? chạy trong chế độ gỡ lỗi và kiểm tra với điểm gỡ lỗi !! – iMBMT

1

Một cách để làm điều này là để ghi đè lên các sự kiện onBrowserEvent của tế bào Editable của bạn và tiêu thụ sự kiện này nếu các tế bào không thể chỉnh sửa.

  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

Tôi không hiểu cách thay đổi ô trong thời gian chạy. Tôi không thể kích hoạt onBrowserEvent. Tôi cũng đang sử dụng các yếu tố DOM ... – fguespe

+0

Nếu bạn bắt đầu nhập vào ô, các sự kiện sẽ xuất hiện trên onBrowserEvent. Dù sao bạn đã trộn lẫn 2 câu trả lời. – Spiff

+0

Tôi đã thêm một số mã, vẫn không thể nhận được onBrowserEvent để kích hoạt. – fguespe

0

Tôi có cùng nhu cầu; và thử nghiệm các kết hợp khác nhau của việc hiển thị ghi đè, isEditing, resetFocus và chỉnh sửa trên EditTextCell (Tôi không thử giải pháp onBrowserEvent).

Khi tôi chỉ ghi đè hiển thị (để hiển thị giá trị HTML nếu không thể chỉnh sửa); Tôi gặp lỗi khi đặt lại tiêu điểm (như discussed here). Điều này tiếp tục ngay cả khi tôi overrode resetFocus. Khi tôi chỉ ghi đè là Chỉnh sửa, ô sẽ nhấp nháy để chỉnh sửa khi được nhấp và sau đó quay lại. Những gì đã làm việc hoàn hảo là chỉnh sửa ghi đè. Tôi đã kích hoạt dựa trên việc thêm thẻ vào giá trị được thông qua bởi Column.getValue, bạn có thể kích hoạt theo ý bạn, nhưng hóa ra lại đơn giản như:

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); 
     } 
    } 
    } 
Các vấn đề liên quan