【问题标题】:Vaadin grid - save/cancel when setEnableEditor= trueVaadin 网格 - 当 setEnableEditor=true 时保存/取消
【发布时间】:2015-06-08 10:03:52
【问题描述】:

我是 vaadin 的新手,当 setEditorEnabled = true 时,我对 savecancel button 有点困惑。

您是否需要提供额外的代码来保存数据,或者当您点击保存时它会自动将所有数据保存到数据库中?

如果有额外的代码,如何向保存和取消按钮添加监听器?

谢谢!

【问题讨论】:

    标签: java vaadin vaadin7 vaadin-grid


    【解决方案1】:

    如果您使用缓冲模式,当您按下“保存”按钮时,已编辑的值将写入源对象。如果您使用无缓冲模式,则版本会立即写入,因此“保存和取消”按钮变得毫无意义。 如果要将编辑后的对象写回数据库,则需要手动添加该功能。在这种情况下使用缓冲模式并将数据库调用方法添加到按下保存按钮时调用的方法是实用的。

    除了将它添加到 CommitHandlerpostCommit 方法中,就像 Daniel Dubec 所写的那样,您还可以覆盖 GridsaveEditor()doCancelEditor() 方法。

    class MyGrid extends Grid {
    
        public MyGrid() {
            setEditorEnabled(true);
            setEditorBuffered(true);
        }
    
        @Override
        public void saveEditor() throws CommitException {
            super.saveEditor();
            // You can persist your data here.
            Notification.show("Item " + getEditedItemId() + " was edited.");
        }
    
        // Be aware that doCancelEditor() is called whenever super.saveEditor() is called!
        @Override
        protected void doCancelEditor() {
            super.doCancelEditor();
            // editedItemId was already set to 'null'.
            Notification.show("Cancel button was pressed");
        }
    }
    

    super.saveEditor() 所做的实际上是在editorFieldGroup 上调用commit() 方法。但这只有在可编辑网格处于缓冲模式时才有意义。 Read more on Field Buffering here。 所以发生的情况是,当您按下保存按钮并调用 super.saveEditor() 时,首先触发预提交事件,然后将编辑器字段值的更改更新到数据源(即提交本身),然后触发后提交事件。 doCancelEditor() 方法在编辑器本身关闭时被调用,这也是它在保存后被调用的原因。

    【讨论】:

      【解决方案2】:

      或者使用 saveListener。我不确定这是否是最好的方法,但它对我有用。

      Grid<Bean> grid;
      grid.getEditor().addSaveListener(new EditorSaveListener<Bean>() {
                  @Override
                  public void onEditorSave(EditorSaveEvent<Bean> event) {
                      // You can persist your data here
                      persistBean(event.getBean());
                  }
              });
      

      【讨论】:

        【解决方案3】:

        尝试为 FieldGroup 添加 CommitHandler

            grid.setEditorEnabled(true);
        
            // register save listener
            grid.getEditorFieldGroup().addCommitHandler(new CommitHandler() {
                @Override
                public void preCommit(CommitEvent commitEvent) throws CommitException {
                }
                @Override
                public void postCommit(CommitEvent commitEvent) throws CommitException {
                    // You can persist your data here
                    Notification.show("Item " + grid.getEditedItemId() + " was edited.");
                }
            });
        

        【讨论】:

          猜你喜欢
          • 2019-01-24
          • 2021-10-04
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多