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

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

List eventList=new ArrayList(); 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(); 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(); 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() { @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 checkintime = new TextField(); checkintime.setAllowBlank(true); checkintime.addListener(Events.Change, new Listener() { @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 checkouttime = new TextField(); checkouttime.setAllowBlank(true); checkouttime.addListener(Events.Change, new Listener() { @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的新手。

UPDATE

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

监听器> gridAfterEditListener = new Listener>(){

  @Override public void handleEvent(GridEvent 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); 

请建议如何解决此问题

考虑禁用和启用单元格,我只是隐藏并使用CSS显示单元格。 以下是我的代码,这使我无法达到此要求。

 GridCellRenderer checkinRenderer=new GridCellRenderer() { @Override public Object render(AttendanceCaseCreationModel model, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, Grid 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; } }; 

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

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

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

示例代码:

  grid.addListener(Events.BeforeEdit, new Listener>() { public void handleEvent(GridEvent 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 } } } }); 

请查看完整的示例代码 。

将afterEdit Listener添加到网格。

  private EditorGrid grid; private ListStore gridStore; private ColumnModel cm; public void onModuleLoad() { ContentPanel cp = new ContentPanel(); cp.setSize(500, 500); List configs = new ArrayList(); List eventList=new ArrayList(); eventList.add("Mark/Modify Attendance"); eventList.add("Remove Attendance"); eventList.add("Modify Roster"); eventList.add("Mark OD"); eventList.add("Forgot To Checkin"); final SimpleComboBox eventcombo = new SimpleComboBox(); 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())); column2.setWidth(100); configs.add(column2); ColumnConfig column3 = new ColumnConfig("desk", "Desk", 105); column3.setEditor(new CellEditor(new TextField())); configs.add(column3); cm = new ColumnModel(configs); gridStore = new ListStore(); 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(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> gridAfterEditListener = new Listener>() { @Override public void handleEvent(GridEvent 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); } } }; 

完整的代码