如何根据gxt中可编辑网格中的另一个单元格值使单元格不可编辑

时间:2014-03-24 13:23:23

标签: java gwt gxt

您好我正在使用GXT 2.2.3创建可编辑网格。我创建了如下列:

   List<String> eventList=new ArrayList<String>();
    eventList.add("Mark/Modify Attendance");
    eventList.add("Remove Attendance");
    eventList.add("Modify Roster");
    eventList.add("Mark OD");
    eventList.add("Forgot To Checkin");

 eventcombo = new SimpleComboBox<String>(); 
 eventcombo.setEmptyText("");
 eventcombo.setTriggerAction(TriggerAction.ALL);
    //  EventCombo.setSelection(eventList);
    CellEditor eventComboEditor = new CellEditor(eventcombo) {  
          public Object preProcessValue(Object value) {  
              if (value == null) {  
                return value;  
              }  
              return eventcombo.findModel(value.toString());  
            }  
          public Object postProcessValue(Object value) {  
               if (value == null) {  
                 return value;  
               }  
             return ((ModelData) value).get("value");  
           }  
         };  
         eventcombo.setForceSelection(true);  
         eventcombo.setEmptyText("");
         eventcombo.setTriggerAction(TriggerAction.ALL); 
        eventcombo.add(eventList);
       ColumnConfig eventcolumn = new ColumnConfig();
    eventcolumn.setId("event");
    eventcolumn.setHeader("Event");
    eventcolumn.setWidth(145);
    eventcolumn.setMenuDisabled(true);
    eventcolumn.setSortable(false);
   /* */
//  column.setEditor(new);
    eventcolumn.setEditor(eventComboEditor);


    configs.add(eventcolumn);

    //rosterInOut-10
       ColumnConfig rosterInOutcolumn = new ColumnConfig();
       rosterInOutcolumn.setId("rosterInOut");
       rosterInOutcolumn.setHeader("Old Roster");
       rosterInOutcolumn.setWidth(70);
       rosterInOutcolumn.setMenuDisabled(true);
       rosterInOutcolumn.setSortable(false);
    configs.add(rosterInOutcolumn);


    Rostercombo = new SimpleComboBox<String>();  
        CellEditor editor1 = new CellEditor(Rostercombo) {  
              public Object preProcessValue(Object value) {  
                  if (value == null) {  
                    return value;  
                  }  
                  return Rostercombo.findModel(value.toString());  
                }  
              public Object postProcessValue(Object value) {  
                   if (value == null) {  
                     return value;  
                   }  
                 return ((ModelData) value).get("value");  
               }  
             };  
             Rostercombo.setForceSelection(true);  
             Rostercombo.setTriggerAction(TriggerAction.ALL);  
             Rostercombo.add("OD");  
             Rostercombo.add("O");

    //newRosterin-11
    ColumnConfig newRosterincolumn = new ColumnConfig();
    newRosterincolumn.setId("newRosterin");
    newRosterincolumn.setHeader("New Roster In");
    newRosterincolumn.setWidth(80);
    newRosterincolumn.setEditor(editor1);
    newRosterincolumn.setMenuDisabled(true);
    newRosterincolumn.setSortable(false);
    configs.add(newRosterincolumn);

    //checkinout-12
     ColumnConfig checkinoutcolumn = new ColumnConfig();
     checkinoutcolumn.setId("checkinout");
     checkinoutcolumn.setHeader("Check In-Out");
     checkinoutcolumn.setWidth(80);
     checkinoutcolumn.setMenuDisabled(true);
     checkinoutcolumn.setSortable(false);
    configs.add(checkinoutcolumn);

    //checkinDate-13
     ColumnConfig checkinDatecolumn = new ColumnConfig();
     checkinDatecolumn.setId("checkinDate");
     checkinDatecolumn.setHeader("Check In Date");
     checkinDatecolumn.setWidth(85);
     checkinDatecolumn.setMenuDisabled(true);
     checkinDatecolumn.setSortable(false);

    final DateField dateField1 = new DateField();
    dateField1.getPropertyEditor().setFormat(DateTimeFormat.getFormat("dd/MMM/yyyy")); 
    dateField1.getDatePicker().addListener(Events.Select, new Listener<DatePickerEvent>() {

        @Override
        public void handleEvent(DatePickerEvent dpe) {

        //  Window.alert("Getting Roster Date here-->"+grid.getColumnModel().);
        Window.alert("Getting RosterDate--."+   caseStoreModule.getModifiedRecords().get(0).get("rosterDate"));



        }
    });

    checkinDatecolumn.setEditor(new CellEditor(dateField1));
    checkinDatecolumn.setDateTimeFormat(DateTimeFormat.getFormat("dd/MMM/yyyy"));
    configs.add(checkinDatecolumn);

    //checkinTime-14
    ColumnConfig checkinTimecolumn=new ColumnConfig();
    checkinTimecolumn.setId("checkinTime");
    checkinTimecolumn.setHeader("Check In Time");
    checkinTimecolumn.setWidth(80);
    checkinTimecolumn.setMenuDisabled(true);
    checkinTimecolumn.setSortable(false);
    final TextField<String> checkintime = new TextField<String>();
    checkintime.setAllowBlank(true);  
    checkintime.addListener(Events.Change, new Listener<BaseEvent>() {

        @Override
        public void handleEvent(BaseEvent be) {

        //  Window.alert("getting the checkin time value-->"+checkintime.getValue());
            String variable = checkintime.getRawValue();
            if(variable != null & !variable.equalsIgnoreCase(""))
            {   
                if(!variable.matches(REG_EXP))
                {
                    checkintime.clear();
                    MsgBox.info("Enter time in hh:mm format");
                    checkintime.focus();

                    return;
                }
            }
        }
    });


    checkinTimecolumn.setEditor(new CellEditor(checkintime));

    configs.add(checkinTimecolumn);



    //checkoutDate-15
    ColumnConfig checkoutDatecolumn=new ColumnConfig();
    checkoutDatecolumn.setId("checkoutDate");
    checkoutDatecolumn.setHeader("Check Out Date");
    checkoutDatecolumn.setWidth(90);
    checkoutDatecolumn.setMenuDisabled(true);
    checkoutDatecolumn.setSortable(false);
    DateField dateField2 = new DateField();
    dateField2.getPropertyEditor().setFormat(DateTimeFormat.getFormat("dd/MMM/yyyy")); 
    checkoutDatecolumn.setEditor(new CellEditor(dateField2));
    checkoutDatecolumn.setDateTimeFormat(DateTimeFormat.getFormat("dd/MMM/yyyy"));
    configs.add(checkoutDatecolumn);

    //checkoutTime-15
    ColumnConfig checkoutTimecolumn=new ColumnConfig();
    checkoutTimecolumn.setId("checkoutTime");
    checkoutTimecolumn.setHeader("Check Out Time");
    checkoutTimecolumn.setWidth(90);
    checkoutTimecolumn.setMenuDisabled(true);
    checkoutTimecolumn.setSortable(false);
    final TextField<String> checkouttime = new TextField<String>();
    checkouttime.setAllowBlank(true);  
    checkouttime.addListener(Events.Change, new Listener<BaseEvent>() {

        @Override
        public void handleEvent(BaseEvent be) {

        //  Window.alert("getting the checkouttime value-->"+checkouttime.getValue());
            String variable = checkouttime.getRawValue();
            if(variable != null & !variable.equalsIgnoreCase(""))
            {   
                if(!variable.matches(REG_EXP))
                {
                    checkouttime.clear();
                    MsgBox.info("Enter time in hh:mm format");
                    checkouttime.focus();

                    return;
                }
            }
        }
    });
    checkoutTimecolumn.setEditor(new CellEditor(checkouttime));
    configs.add(checkoutTimecolumn);

    //for gradeCode-16
    ColumnConfig gradeCodecolumn=new ColumnConfig();
    gradeCodecolumn.setId("gradeCode");
    gradeCodecolumn.setHidden(true);
    configs.add(gradeCodecolumn);

    //for rosterevent-17
ColumnConfig    rostereventcolumn=new ColumnConfig();
rostereventcolumn.setId("rosterevent");
rostereventcolumn.setHidden(true);
    configs.add(rostereventcolumn);

    //for action-18
    ColumnConfig actioncolumn=new ColumnConfig();
    actioncolumn.setId("action");
    actioncolumn.setHeader("Action");
    //column.setHidden(true);
    actioncolumn.setWidth(70);
    actioncolumn.setMenuDisabled(true);
    actioncolumn.setSortable(false);
    configs.add(actioncolumn);

    //for actionHidden-19
    ColumnConfig actionHiddencolumn=new ColumnConfig();
    actionHiddencolumn.setId("actionHidden");
    actionHiddencolumn.setHidden(true);
    configs.add(actionHiddencolumn);

    //for attendId-20
    ColumnConfig attendIdcolumn=new ColumnConfig();
    attendIdcolumn.setId("attendId");
    attendIdcolumn.setHidden(true);
    configs.add(attendIdcolumn);

    //for rosterChanged-21
    ColumnConfig    rosterChangedcolumn=new ColumnConfig();
    rosterChangedcolumn.setId("rosterChanged");
    rosterChangedcolumn.setHidden(true);
    configs.add(rosterChangedcolumn);

    // for holiday-22
    ColumnConfig holidaycolumn=new ColumnConfig();
    holidaycolumn.setId("holiday");
    holidaycolumn.setHidden(true);
    configs.add(holidaycolumn);

    // for checkinDateTimeHidden-23
    column=new ColumnConfig();
    column.setId("checkinDateTimeHidden");
    column.setHidden(true);
    configs.add(column);

    // for checkoutDateTimeHidden-24
    ColumnConfig checkoutDateTimeHiddencolumn=new ColumnConfig();
    checkoutDateTimeHiddencolumn.setId("checkoutDateTimeHidden");
    checkoutDateTimeHiddencolumn.setHidden(true);
    configs.add(checkoutDateTimeHiddencolumn);

    // for loginEmpEntity-25
    ColumnConfig loginEmpEntitycolumn=new ColumnConfig();
    loginEmpEntitycolumn.setId("loginEmpEntity");
    loginEmpEntitycolumn.setHidden(true);
    configs.add(loginEmpEntitycolumn);

    // for  halfDayLLimit-26
    ColumnConfig halfDayLLimitcolumn=new ColumnConfig();
    halfDayLLimitcolumn.setId("halfDayLLimit");
    halfDayLLimitcolumn.setHidden(true);
    configs.add(halfDayLLimitcolumn);



    return new ColumnModel(configs);

现在我想将checkinDate,CheckIntime,CheckOutDate和CheckOutTime列单元格设置为不可编辑或基于eventCombo框值的值禁用。

如何在eventCombo的监听器中进行此操作。请提示。

  

我是GXT的新手。

     

更新

我尝试使用以下代码来禁用和启用单元格,但它会禁用单元格。但禁用后,如果我选择另一个则不会再次启用。

听者GT; gridAfterEditListener = new Listener&gt;(){

    @Override
    public void handleEvent(GridEvent<AttendanceCaseCreationModel> be) {
        AttendanceCaseCreationModel data = be.getModel();
         String val = data.get("event");

         if(val.equalsIgnoreCase("Remove Attendance")){

            data.set("checkinDate","");


              grid.getColumnModel().getColumnById("checkinDate").getEditor().disable();
              grid.getStore().update(data); 
              grid.getView().refresh(true);


         }
         else {
             data.set("checkinDate",""); 
             grid.getColumnModel().getColumnById("checkinDate").getEditor().enable();
         grid.getStore().update(data); 
             grid.getView().refresh(true);

         }

    }
};
grid.addListener(Events.AfterEdit, gridAfterEditListener); 

请建议如何解决此问题

3 个答案:

答案 0 :(得分:3)

考虑禁用和启用单元格,我只是隐藏并使用CSS显示单元格。以下是我的代码,可以帮助我满足这一要求。

GridCellRenderer<AttendanceCaseCreationModel> checkinRenderer=new GridCellRenderer<AttendanceCaseCreationModel>() {

        @Override
        public Object render(AttendanceCaseCreationModel model, String property,
                ColumnData config, int rowIndex, int colIndex,
                ListStore<AttendanceCaseCreationModel> store,
                Grid<AttendanceCaseCreationModel> grid) {

            String color="pink";
            if(eventcombo.getValue()!=null){


                if(eventcombo.getRawValue().equalsIgnoreCase("Forgot To Checkin") || 
                        eventcombo.getRawValue().equalsIgnoreCase("Mark/Modify Attendance")){
                    color="pink";
                }
                else{

                    config.style=config.style+ ";visibility: hidden;";
                }

            }

            config.style=config.style+ ";background-color:" + color  + ";";
            config.style=config.style+ ";display: block;";
            Object value = model.get(property);
            return value;

        }
    };

答案 1 :(得分:3)

如何根据gxt中可编辑网格中的其他单元格值将单元格设置为不可编辑

尝试使用BeforeEdit侦听器并根据您的条件调用event.setCancelled(true)以禁用编辑。

无需禁用/启用单元格。根据条件,在当前单元格中停止编辑

示例代码:

    grid.addListener(Events.BeforeEdit, new Listener<GridEvent<ModelData>>() {
        public void handleEvent(GridEvent<ModelData> be) {

            // disable 2nd cell based on value of 1st cell
            ModelData data = be.getModel();
            String val = data.get("event"); // read 1st cell value
            if (val.equalsIgnoreCase("Remove Attendance")) {
                if (be.getColIndex() == 2) { // disable 2nd cell only
                    be.setCancelled(true);// Disable edition
                }
            }
        }
    });

请查看complete sample code

答案 2 :(得分:1)

将afterEdit Listener添加到网格。

 private EditorGrid<ModelData> grid;
 private ListStore<ModelData> gridStore;
 private ColumnModel cm;
 public void onModuleLoad() {

 ContentPanel cp = new ContentPanel();
 cp.setSize(500, 500);




 List<ColumnConfig> configs = new ArrayList<ColumnConfig>();  


List<String> eventList=new ArrayList<String>();
eventList.add("Mark/Modify Attendance");
eventList.add("Remove Attendance");
eventList.add("Modify Roster");
eventList.add("Mark OD");
eventList.add("Forgot To Checkin");

final SimpleComboBox<String> eventcombo = new SimpleComboBox<String>(); 
eventcombo.setEmptyText("");
eventcombo.setTriggerAction(TriggerAction.ALL);
//  EventCombo.setSelection(eventList);
 CellEditor eventComboEditor = new CellEditor(eventcombo) {  
    public Object preProcessValue(Object value) {  
      if (value == null) {  
        return value;  
      }  
      return eventcombo.findModel(value.toString());  
    }  
  public Object postProcessValue(Object value) {  
       if (value == null) {  
         return value;  
       }  
     return ((ModelData) value).get("value");  
   }  
 };  
 eventcombo.setForceSelection(true);  
 eventcombo.setEmptyText("");
 eventcombo.setTriggerAction(TriggerAction.ALL); 
 eventcombo.add(eventList);

ColumnConfig column = new ColumnConfig();  
column.setId("event");  
column.setHeaderHtml("Co Manager/Distributor");  
column.setEditor(eventComboEditor);  
column.setWidth(200);
configs.add(column);  

ColumnConfig column2 = new ColumnConfig();  
column2.setId("test");  
column2.setHeaderHtml("Test");  
column2.setEditor(new CellEditor(new TextField<String>()));
column2.setWidth(100);
configs.add(column2);  

ColumnConfig column3 = new ColumnConfig("desk", "Desk", 105);  
column3.setEditor(new CellEditor(new TextField<String>()));
configs.add(column3);

cm = new ColumnModel(configs);
gridStore = new ListStore<ModelData>();
ModelData md = new BaseModelData();
md.set("event", "Modify Roster");
md.set("test","A1");
md.set("desk", "A2");
gridStore.add(md);

md = new BaseModelData();
md.set("test","B1");
md.set("event", "Remove Attendance");
md.set("desk", "B2");
gridStore.add(md);

md = new BaseModelData();
md.set("test","C1");
md.set("desk", "C2");
md.set("event", "Mark OD");
gridStore.add(md);

gridStore.commitChanges();

grid = new EditorGrid<ModelData>(gridStore, cm);
grid.setBorders(true);
grid.setStripeRows(true);
grid.setTrackMouseOver(true);
grid.disableTextSelection(false);
grid.setHideHeaders(false);
grid.setHeight(500);
grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);

grid.addListener(Events.AfterEdit, gridAfterEditListener);



Viewport viewport = new Viewport();
viewport.setLayout(new FlowLayout());

cp.add(grid);
viewport.add(cp ,new FitData(new Margins(0,0,56,0)));
RootPanel.get("content").add(viewport);


}


Listener<GridEvent<ModelData>> gridAfterEditListener = new Listener<GridEvent<ModelData>>() {
  @Override
    public void handleEvent(GridEvent<ModelData> be) {

     ModelData data = be.getModel();
     String val = data.get("event");
    if(val.equalsIgnoreCase("Remove Attendance")){
          data.set("test","new test");
          grid.getColumnModel().getColumnById("desk").getEditor().disable();
          grid.getStore().update(data); 
          grid.getView().refresh(true);
    }   
   else{

        data.set("test","old test");
        grid.getColumnModel().getColumnById("desk").getEditor().enable();
        grid.getStore().update(data); 
        grid.getView().refresh(true);

     }
 }
};

完整的代码