我的Datagrid
列有CheckboxCell
列。将会有一些无法检查的行,我想要实现的方法是处理“已检查”事件并在满足某些条件时取消它。这是我尝试过的代码:
Column<Job, Boolean> selectColumn = new Column<Job, Boolean>(new CheckboxCell()) {
@Override
public Boolean getValue(Job job) {
// do I uncheck the cell here?
return JobDataGrid.this.jobSelection.isSelected(job);
}
@Override
public void onBrowserEvent(Cell.Context context, Element elem, Job object, NativeEvent event)
{
super.onBrowserEvent(context, elem, object, event);
String eventType = event.getType();
if ("change".equals(eventType)) {
// do I uncheck the cell here?
}
}
};
如何处理事件并将复选框设置为未选中?
答案 0 :(得分:0)
如果您想阻止复选框中的更改,您只需取消onBrowserEvent
方法中的原生事件:
event.preventDefault();
请注意,如果您在单击复选框时未更新对象,则可以随时刷新()DataGrid,复选框将以原始状态显示。
答案 1 :(得分:0)
如果您想要取消选中复选框,从UX角度来看最好是禁用。
您可以创建一个自定义复选框单元格,您可以在其中控制元素渲染的各个方面,包括禁用状态:
public class UncheckableCheckboxCell extends CheckboxCell {
interface Template extends SafeHtmlTemplates {
@Template("<input type=\"checkbox\" tabindex=\"-1\" checked/>")
SafeHtml INPUT_CHECKED();
@Template("<input type=\"checkbox\" tabindex=\"-1\"/>")
SafeHtml INPUT_UNCHECKED();
@Template("<input type=\"checkbox\" tabindex=\"-1\" disabled=\"disabled\"/>")
SafeHtml INPUT_UNCHECKED_DISABLED();
}
private static UncheckableCheckboxCell.Template template = GWT.create(UncheckableCheckboxCell.Template.class);
public UncheckableCheckboxCell(boolean dependsOnSelection, boolean handlesSelection) {
super(dependsOnSelection, handlesSelection);
}
@Override
public void render(Context context, Boolean value, SafeHtmlBuilder sb) {
// Get the view data.
Object key = context.getKey();
Boolean viewData = getViewData(key);
if (viewData != null && viewData.equals(value)) {
clearViewData(key);
viewData = null;
}
if (value != null && ((viewData != null) ? viewData : value)) {
sb.append(template.INPUT_CHECKED());
} else if (value == null) {
//use null value as an indicator of unchecked and disable state
sb.append(template.INPUT_UNCHECKED_DISABLED());
} else {
sb.append(template.INPUT_UNCHECKED());
}
}
}
然后在getValue()方法中,如果要取消选中/禁用复选框,则可以返回null:
@Override
public Boolean getValue(Job job) {
// is my job checkable?
if (job.checkable()) {
//return null explicitly so my custom cell knows it should be rendered as disabled
return null;
} else {
return JobDataGrid.this.jobSelection.isSelected(job);
}
}