Как отменить выбор строки в GWT CellTable без включения onSelectionChange (...) - PullRequest
2 голосов
/ 02 декабря 2011

У меня есть GWT CellTable с включенной SingleSelectionModel.Как только пользователь щелкает строку, onSelectionChange (...) запускает мой диалог подтверждения, который спрашивает пользователя, продолжать или нет.Проблема в том, что когда пользователь нажимает кнопку «Отмена», ничего не происходит, но он не может выбрать одну и ту же строку (предположим, что только одна строка в CellTable). Я знаю, что могу отменить выбор, когда пользователь нажмет кнопку «Отмена», но этоснова запускает onSelectionChange (..) и запускает мой диалог подтверждения ..... это бесконечный цикл.

Ниже мой код:

// Add SelectionModel to dTable;
final SingleSelectionModel<Driver> ssm = new SingleSelectionModel<Driver>();
dTable.setSelectionModel(ssm);
ssm.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@ Override
public void onSelectionChange(final SelectionChangeEvent event)
{

SC.confirm("Do you want to contact the driver?", new BooleanCallback() {
public void execute(Boolean value) {
if (value != null && value) {
final Driver d = ssm.getSelectedObject();
dataStoreService.updateDrivers(d._UUID.toString(),tripDate.getValue(), loginInfo.getEmailAddress(),destination.getText().trim(),
new AsyncCallback<String>() {
public void onFailure(Throwable caught) {

caught.printStackTrace();
}

public void onSuccess(String uuid) {
Window.alert("The driver has been notified. Please keep your reference id: "+uuid);
}
});
dataStoreService.getBookings(loginInfo.getEmailAddress(), new AsyncCallback<List<Booking>>() {
public void onFailure(Throwable caught) {

caught.printStackTrace();
}

public void onSuccess(List<Booking> myBookings) {
ClientUtilities.populateBookings(bookingDataProvider, myBookings);
}
});
} else {
//clear selection
//ssm.setSelected(ssm.getSelectedObject(), false);

}
}
});

}
});

Может кто-нибудь сказать мне, как обрабатыватьтакая ситуация в CellTable?Я открыт для любых решений.

Ответы [ 2 ]

3 голосов
/ 02 декабря 2011

SelectionChangeEvent срабатывает после выбор изменился. Это неподходящее место для запроса подтверждения: уже слишком поздно.

Вам лучше использовать CellPreviewEvent.Handler. См. https://groups.google.com/d/topic/google-web-toolkit/YMbGbejU9yg/discussion, в котором обсуждается точно такая же проблема (подтвердить изменение выбора) и приводится пример кода.

0 голосов
/ 06 сентября 2013

Вот фрагмент кода с решением для отмены выбора строк в сетке данных:

public abstract class MyDataGrid<T> extends DataGrid<T> {

    private MultiSelectionModel<T> selectionModel_;
    private Set<T> priorSelectionSet_; 

    ....


    /**
     * Allows User To Deselect A DataGrid Row By Clicking A Second Time On The Prior Selection
     */
    private void addDeselectMechanism(){
         /*
        NOTES:    
            1. ClickHandler() fires every time the grid is clicked.  
            2. selectionModel SelectionChangeHandler() does NOT fire when clicking
               a row that is already selected.
            3. Generally, ClickHandler() fires and then SelectionChangeHandler() fires,
               but testing showed some exceptions to this order and duplicate firings.
            4. The Current SelectedSet is Updated AFTER the ClickHandler() fires, so "natural"
               ClickHandler() timing does not permit current SelectedSet inspections.  
            5. In this case, the scheduleDeferred() code will ALWAYS fires when a grid is clicked,
               it will fire at a PREDICTABLE time, and AFTER the current SelectedSet has been updated.                
        */      
        super.addHandler(new ClickHandler(){
            @Override
            public void onClick(ClickEvent event) {
                Scheduler.get().scheduleDeferred(new ScheduledCommand() {    
                    @Override
                    public void execute() {
                        Set<T> currentSelectedSet = selectionModel_.getSelectedSet();
                        if( (currentSelectedSet.size() == 1) &&
                            (priorSelectionSet_ != null) ){
                            if( (currentSelectedSet.size() == priorSelectionSet_.size()) &&                     
                                (currentSelectedSet.containsAll( priorSelectionSet_ ) ) ){                          
                                selectionModel_.clear();
                            }
                        }
                        priorSelectionSet_ = new HashSet<T>();
                        priorSelectionSet_.addAll( selectionModel_.getSelectedSet() );                                        
                    }
                });             

            }
        }, ClickEvent.getType());
    }

    .....

}
...