【问题标题】:How to make only some columns editable in a Vaadin Grid?如何在 Vaadin 网格中仅使某些列可编辑?
【发布时间】:2015-09-02 10:08:46
【问题描述】:

Vaadin Grid 允许定义为可编辑

grid.setEditorEnabled(true);

这使得所有可见的列都可以编辑。但是我不希望用户编辑特定列,但似乎可编辑是全有或全无。

我发现的下一个最佳解决方案是使用禁用的编辑器定义一个编辑器字段,这几乎可以解决问题,但用户仍然可以选择文本并移动光标(但该字段不再可编辑)。

Grid.Column nameColumn = grid.getColumn("fullName");
nameColumn.setHeaderCaption("Full Name");
nameColumn.setEditorField(getNoEditableTextField());

...

private Field<?> getNoEditableTextField() {
    TextField noEditableTextFiled = new TextField();
    noEditableTextFiled.setEnabled(false);
    return noEditableTextFiled;
}

我认为不能使用 Label,因为它不是 Field。

有没有更好的选择来实现这一点?

edit:正如 aakath 所说,有一种方法可以实现此目的,但不能编辑列,但这样做时,当您编辑行时,单元格值会消失,这是不可取的。

【问题讨论】:

    标签: java vaadin vaadin7 vaadin-grid


    【解决方案1】:

    您是否尝试在该列上调用setEditable(false) 方法?我相信当项目编辑器处于活动状态时,它应该使该字段不可编辑。

    grid.getColumn("fullName").setEditable(false);
    

    【讨论】:

    • 试过了,该列不再可编辑。但是,当显示编辑器时,该列会消失,这是不可取的。
    【解决方案2】:

    我的解决方案如下。我刚刚完成。它没有经过太多测试。但它可能会给你一些想法。

      getColumn(columnName).setEditable(true).setEditorField(getNoEditableField(columnName));
    

    ...

    private Field<?> getNoEditableField(final String columnName) {
        CustomField<Label> result = new CustomField() {
            @Override
            protected Component getContent() {
                Label result = (Label) super.getContent();
                Object editedItemId = getEditedItemId();
                String value = DEFAULT_VALUE;
                if (editedItemId != null) {
                    value = CustomizableGrid.this.toString(getContainerDataSource().getItem(editedItemId).getItemProperty(columnName).getValue());
                }
                result.setValue(value);
                return result;
            }
    
            @Override
            protected Component initContent() {
                Label result = new Label(DEFAULT_VALUE, ContentMode.HTML);
                result.setDescription(getColumnDescription(columnName));
                result.setStyleName("immutablegridcellstyle");
                return result;
            }
    
            @Override
            public Class getType() {
                return Label.class;
            }
        };
        result.setConverter(new Converter<Label, Object>() {
        //converter for your data
        });
    
        return result;
    }
    

    【讨论】:

    • 有效!我必须将网格作为参数传递给该方法才能获得正在编辑的行,但结果是我所期望的。我的用例的转换器是 Converter
    【解决方案3】:

    我遇到了同样的问题,不希望点击 id 列打开编辑器。我通过添加如下所示的 ItemClickListener 解决了它。对我来说效果很好。

    grid.addItemClickListener((ItemClickListener<GridBean>) event -> grid.getEditor().setEnabled(!event.getColumn().getCaption().equals("Id")));
    

    此外,通过单击特定列 Grid 不再可编辑。

    【讨论】:

      【解决方案4】:

      有一个棘手的方法来做到这一点!我刚刚发现了。 所以,首先你需要使用带有容器的网格,而不是直接添加行:

      BeanItemContainer<MyBean> container = new BeanItemContainer<>(MyBean.class);
      setContainerDataSource(container);
      

      然后从 MyBean 中删除字段设置器,但您必须编辑的字段设置器除外。

      【讨论】:

      • 我目前正在使用 BeanItemContainer,该 bean 类没有 setFullName() 方法,但在编辑行时它没有显示任何内容。
      • 那么,你达到预期了吗?
      • 我不确定它是否有效,我一开始就没有二传手。
      【解决方案5】:

      我认为同样可以通过将网格设置为grid.setEditorEnabled(true); 可编辑的网格并禁用grid.getColumn(columnName).setEditable(false); 等其他列的编辑选项来实现。但我不确定这种方法有什么缺点。任何建议都会受到赞赏。

      【讨论】:

        【解决方案6】:

        它很简单,只需转到 Vaadin 文档,它的作用如下: 你可以在这里看到我给了一个指定的column Name

        grid = new Grid<>();
            lst = new ArrayList<>();
            provider = new ListDataProvider<>(lst);
            lst.add(new Company(1, "Java"));
            grid.setDataProvider(provider);
            grid.addColumn(Company::getSerialNo).setCaption("Sr.no");
            TextField tf = new TextField();
        
            grid.getEditor().setEnabled(true);
        
            HorizontalLayout hlyt = new HorizontalLayout();
            grid.addColumn(Company::getName).setEditorComponent(tf, Company::setName).setCaption("Name").setExpandRatio(2);
        
            hlyt.addComponent(grid);
        

        【讨论】:

          【解决方案7】:

          我使用以下方法来获取只读字段,诀窍是覆盖 setEnabled 方法以获取禁用的文本字段。如果您在 Vaadin Grid 中跟踪源代码,无论您将什么字段传递给 Grid,它都会始终调用 field.setEnabled(true)。

          myGrid.getColumn(propertyId).setEditorField(new ReadOnlyField());
          

          public class ReadOnlyField extends TextField
          {
              public ReadOnlyField()
              {
                  super();
                  this.setReadOnly(true);
              }
          
              @Override
              public void setEnabled(boolean enabled)
              {
                  // always set to disabled state
                  super.setEnabled(false);
              }
          }
          

          【讨论】:

          • 有趣的方法,会试试这个,让你知道
          • 这“有效”,但行为具有误导性。编辑器显示保存和取消按钮,但没有可编辑的内容。
          猜你喜欢
          • 2011-05-09
          • 2023-02-19
          • 2011-02-21
          • 2018-10-20
          • 2014-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多