Ich konnte dies mit default checkbox selection event manager erreichen.
Standardmäßig hätten Sie eine CheckboxCell
, die Zeilenauswahl behandeln würde. Der Trick ist, dass Sie die render()
Methode der CheckboxCell
überschreiben und das Kontrollkästchen nicht rendern können, wenn die entsprechende Zeile nicht ausgewählt werden kann, indem einfach super.render()
Methode aufgerufen wird.
Unten ist ein vollständiger Arbeitscode für Ihr Beispiel. Sie können keine Zeilen auswählen, die nicht aktiv sind. Bitte beachten Sie die Parameter des Konstruktors new CheckboxCell(true, false)
- das ist wichtig.
public Widget test() {
DataGrid<DatagridType> grid = new DataGrid<DatagridType>();
final MultiSelectionModel<DatagridType> selectionModel = new MultiSelectionModel<DatagridType>(new ProvidesKey<DatagridType>() {
@Override
public Integer getKey(DatagridType item) {
return item.getRowId();
}
});
grid.setSelectionModel(selectionModel, DefaultSelectionEventManager.<DatagridType> createCheckboxManager());
selectionModel.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
Window.alert(selectionModel.getSelectedSet().toString());
}
});
grid.addColumn(new Column<DatagridType, Boolean>(new CheckboxCell(true, false)) {
@Override
public Boolean getValue(DatagridType object) {
return selectionModel.isSelected(object);
}
@Override
public void render(Context context, DatagridType object, SafeHtmlBuilder sb) {
if(object.isActive())
super.render(context, object, sb);
}
}, "Select");
TextColumn<DatagridType> nameColumn = new TextColumn<DatagridType>() {
@Override
public String getValue(DatagridType object) {
return object.getEmpName();
}
};
TextColumn<DatagridType> idColumn = new TextColumn<DatagridType>() {
@Override
public String getValue(DatagridType object) {
return Integer.toString(object.getEmpId());
}
};
TextColumn<DatagridType> statusColumn = new TextColumn<DatagridType>() {
@Override
public String getValue(DatagridType object) {
return object.isActive() ? "Active" : "In Acticve";
}
};
grid.addColumn(nameColumn, "EMP Name");
grid.addColumn(idColumn, "EMP ID");
grid.addColumn(statusColumn, "Status");
List<DatagridType> values = new ArrayList<DatagridType>();
values.add(new DatagridType(0, "ABC", 1001, true));
values.add(new DatagridType(1, "ABC", 1001, false));
values.add(new DatagridType(2, "AAA", 1002, true));
values.add(new DatagridType(3, "AAA", 1002, false));
values.add(new DatagridType(4, "BBB", 1003, true));
values.add(new DatagridType(5, "BBB", 1003, false));
grid.setRowData(values);
grid.setHeight("500px");
Window.alert("Done");
return grid;
}
private class DatagridType {
private int rowId;
private String empName;
private int empId;
private boolean active;
public DatagridType(int rowId, String empName, int empId, boolean active) {
this.rowId = rowId;
this.empName = empName;
this.empId = empId;
this.active = active;
}
public int getRowId() {
return rowId;
}
public String getEmpName() {
return empName;
}
public int getEmpId() {
return empId;
}
public boolean isActive() {
return active;
}
@Override
public String toString() {
return Integer.toString(rowId);
}
}
Ich musste nur eine eindeutige Zeilenkennung als Auswahl-ID hinzufügen.
Nach jeder Änderung der Auswahl sehen Sie eine Warnung mit einer Liste ausgewählter Zeilen-IDs.
