代码之家  ›  专栏  ›  技术社区  ›  Anish Sana

GWT-当选中另一个复选框单元格时,如何以编程方式取消选中复选框单元格?

  •  0
  • Anish Sana  · 技术社区  · 8 年前

    给两个 CheckboxCell 复选框 复选框B checkboxB = false 什么时候 checkboxA = false ,但此更改没有反映在ui中。

    我的带复选框的桌子-

    public void buildTable() {
        myDataProvider.addDataDisplay(myTable);
    
        // other columns
    
        Column<Note, Boolean> checkboxA = new Column<Note, Boolean>(new CheckboxCell()){
    
            @Override
            public Boolean getValue(Note object) {
                return object.isAChecked();
            }
    
        };
    
        checkboxA.setFieldUpdater(new FieldUpdater<Note, Boolean>() {
    
            @Override
            public void update(int index, Note object, Boolean value) {
                performCheckboxAOperation(object, value);
            }
        });
    
        Column<Note, Boolean> checkboxB = new Column<Note, Boolean>(new CheckboxCell()){
    
            @Override
            public Boolean getValue(Note object) {
                return object.isBChecked();
            }
    
        };
    
        checkboxB.setFieldUpdater(new FieldUpdater<Note, Boolean>() {
    
            @Override
            public void update(int index, Note object, Boolean value) {
                performCheckboxBOperation(object, value);
            }
        });
    
        myTable.addColumn(checkboxA, "BOX A");
        myTable.addColumn(checkboxB, "BOX B");
    }
    

    方法在数据库中存储复选框A的值,如果 checkboxA == false ,也设置 复选框B=假 在数据库中-

    public void performCheckboxAOperation(Note note, Boolean bool) {
        this.presenter.performBoxOperation(note, bool, new AsyncCallback<CNote>() {
    
            @Override
            public void onFailure(Throwable caught) {
                // error logic
            }
    
            @Override
            public void onSuccess(CompanyNote result) {
                cleanupDataProvider.flush();
    
                if (result.isAChecked() == false) {
                    if (result.isBChecked() == true) {
                        unsetB(result);
                    }
                }
            }
        });
    }
    

    这是我取消设置checkboxB的方法,它正在更改db中的值,但不在ui中。-

    private void unsetB(Note note) {
        this.presenter.performBoxOperation(note, false, new AsyncCallback<Note>() {
    
            @Override
            public void onFailure(Throwable caught) {
                // error logic
            }
    
            @Override
            public void onSuccess(Note result) {
                myDataProvider.flush();
                myTable.redraw();
            }
        });
    }
    

    据我所知, 列表数据提供程序 需要刷新以使更改反映在ui中。这对于表中的所有其他字段都非常有效,但它不适用于checkboxcells。

    我已经试过了 redraw() 上面可以看到的桌子,但没有任何运气。

    那么,当单击一个checkboxcell时,我应该做什么来触发另一个checkboxcell中的用户界面更改呢?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Adam    8 年前

    我想你忘了改变物体的价值。

    private void unsetB(final Note note) {
        this.presenter.performBoxOperation(note, false, new AsyncCallback<Note>() {
            // ...
            @Override
            public void onSuccess(Note result) {
                note.setB(false);  // set B value or copy `result` to `note`
                                   // (`note` must be final)
                myDataProvider.flush();
                myTable.redraw();
            }
        });
    }
    

    另外,在 performCheckboxAOperation 你打电话来 unsetB(result); -应该是 unsetB(note);

    你需要明白 onSuccess 你得到一份 Note . 这个 result 对象不在 DataProvider , note 是。你应该改变 笔记 的值。

    推荐文章