【问题标题】:GWT DataGrid: use of CheckboxCell-selection and standard line mode selection at the same timeGWT DataGrid:同时使用CheckboxCell-selection和标准行模式选择
【发布时间】:2016-06-13 13:03:49
【问题描述】:

我正在使用带有 MultiSelectionModel 的 GWT DataGrid。

网格项目的选择应该通过

a) 带有 CheckboxCell 的 CheckboxColumn

另外同时通过

b) 标准线模式选择模型(通过点击线的其余部分)。

使用 CheckboxColumn 应该允许用户多选不同的条目。但是,当单击数据网格线上的其他位置时,应该执行单行选择策略,这意味着,如果在使用复选框之前完成了多项选择,则应重置此选择,并且只有单击的行应该之后再选择。

这就是我所拥有的。有人知道如何同时启用 CheckBox-Mode 和 line-selection-mode 吗?

public class JobDataGrid extends DataGrid<Job>
{
    private MultiSelectionModel<Job> selectionModel;

    private Column<Job, Boolean> checkboxColumn;
    private TextColumn<Job> idColumn;
    private TextColumn<Job> titleColumn;
    private TextColumn<Job> timestampColumn;
    private TexTColumn<Job> ...

    public JobDataGrid ()
    {
        super ();

        checkboxColumn = new Column<Job, Boolean> (new CheckboxCell (true, false)) {
            @Override
            public Boolean getValue (Job job)
            {
                // Get the value from the selection model.
                return selectionModel.isSelected (job);
            }
        };
        checkboxColumn.setFieldUpdater (new FieldUpdater<Job, Boolean> () {
            public void update (int index, Job job, Boolean value)
            {
                // Called when the user clicks on a checkbox.
                selectionModel.setSelected (job, value);
            }
        });

        // [...]
        // [...]
        // [...]

        selectionModel = new MultiSelectionModel<Job> ();
        setSelectionModel (selectionModel); 
        // setKeyboardSelectionPolicy (KeyboardSelectionPolicy.DISABLED);

        // [...]
        // [...]
        // [...]
    }
}

我已经尝试了所有 4 种变体

new CheckboxCell (false, false);
new CheckboxCell (true, false);
new CheckboxCell (false, true);
new CheckboxCell (true, true);

但他们都没有出现我需要的东西。而且我也玩过

setSelectionModel (selectionModel, DefaultSelectionEventManager.<Job> createCheckboxManager ());

也许

createCustomManager(DefaultSelectionEventManager.EventTranslator<T> translator) 

会有帮助吗?

谢谢 托马斯

【问题讨论】:

    标签: gwt


    【解决方案1】:

    您可以创建自己的“复选框管理器”并在那里做您想做的事情。

    table.setSelectionModel(selectModel, DefaultSelectionEventManager.<DocumentListItemDTO> createCustomManager(
                new DefaultSelectionEventManager.CheckboxEventTranslator<DocumentListItemDTO>() {
                    @Override
                    public SelectAction translateSelectionEvent(CellPreviewEvent<DocumentListItemDTO> event) {
                        SelectAction action = super.translateSelectionEvent(event);
                        if (action.equals(SelectAction.IGNORE)) {
    
                            if (!event.getNativeEvent().getCtrlKey() && !event.getNativeEvent().getShiftKey())
                                selectionModel.clear();
    
                            return SelectAction.TOGGLE;
    
                        }
                        return action;
                    }
                }));
    

    【讨论】:

    • 好的,谢谢,但是如何过滤 checkboxCell-click-events 和 line-click-events 那里?
    【解决方案2】:

    Lista's answer 出现了正确的方向!

    为了展示DefaultSelectionEventManager.CheckboxEventTranslator的用法,在网上几乎找不到例子,这里是一个功能齐全的解决方案:

    setSelectionModel (selectionModel, DefaultSelectionEventManager.<Job> createCustomManager (
            new DefaultSelectionEventManager.CheckboxEventTranslator<Job> () {
    
                @Override
                public SelectAction translateSelectionEvent (CellPreviewEvent<Job> event)
                {
                    NativeEvent nativeEvent = event.getNativeEvent ();
    
                    // Determine if we clicked on a checkbox.
                    Element target = nativeEvent.getEventTarget ().cast ();
                    if ("input".equals (target.getTagName ().toLowerCase (Locale.ROOT)))
                    {
                        final InputElement input = target.cast ();
                        if ("checkbox".equals (input.getType ().toLowerCase (Locale.ROOT)))
                        {
                            // Synchronize the checkbox with the current selection state.
                            input.setChecked (event.getDisplay ().getSelectionModel ().isSelected (
                                    event.getValue ()));
                            return SelectAction.TOGGLE;
                        }
                    }
                    else
                    {
                        if (BrowserEvents.CLICK.equals (nativeEvent.getType ()))
                        {
                            selectionModel.clear ();
                            return SelectAction.SELECT;
                        }
                    }
                    return SelectAction.IGNORE;
                }
            }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2011-11-26
      相关资源
      最近更新 更多