动态和编程取消选中复选框单元格

时间:2015-01-05 23:09:53

标签: gwt

我的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?
        }
    }
};

如何处理事件并将复选框设置为未选中?

2 个答案:

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