0

如果我们这样做,在 vaadin 表中

table.setRowHeaderMode(RowHeaderMode.INDEX);

我们得到一个带有行索引的列。

是否有可能与 vaadin 网格相同?

4

5 回答 5

3

到目前为止,我还没有看到这样的选项,但是您应该可以使用生成的 column来伪造它。请参阅下面的简单实现,它应该可以帮助您入门(非常欢迎改进和建议):

// our grid with a bean item container
Grid grid = new Grid();
BeanItemContainer<Person> container = new BeanItemContainer<>(Person.class);

// wrap the bean item container so we can generated a fake header column
GeneratedPropertyContainer wrappingContainer = new GeneratedPropertyContainer(container);
wrappingContainer.addGeneratedProperty("rowHeader", new PropertyValueGenerator<Long>() {
    private long index = 0;

    @Override
    public Long getValue(Item item, Object itemId, Object propertyId) {
        return index++;
    }

    @Override
    public Class<Long> getType() {
        return Long.class;
    }
});

// assign the data source to the grid and set desired column order
grid.setContainerDataSource(wrappingContainer);
grid.setColumnOrder("rowHeader", "name", "surname");

// tweak it a bit - definitely needs more tweaking
grid.getColumn("rowHeader").setHeaderCaption("").setHidable(false).setEditable(false).setResizable(false).setWidth(30);

// freeze the fake header column to prevent it from scrolling horizontally
grid.setFrozenColumnCount(1);

// add dummy data
layout.addComponent(grid);
for (int i = 0; i < 20 ; i++) {
    container.addBean(new Person("person " + i, "surname " + i));
}

这将生成类似于下图的内容:

模拟行标题

于 2016-01-12T15:55:03.640 回答
2

现在有一个 Grid Renderer 可以用来执行此操作。它位于网格渲染器插件https://vaadin.com/directory/component/grid-renderers-collection-for-vaadin7中。它也与 Vaadin 8 兼容。

以下是它的使用方法(如何呈现索引有几个不同的选项)。 grid.addColumn(value -> "", new RowIndexRenderer()).setCaption("Row index");

于 2018-01-11T16:08:06.603 回答
1

值得一提的是,我使用以下内容Vaadin 18 flow并完美运行。

grid.addColumn(TemplateRenderer.of("[[index]]")).setHeader("#");
于 2021-01-14T13:19:10.360 回答
0

我使用这个技巧:

int i = 0;    
grid.addComponentColumn(object -> {
                i++;
                return new Label("" + i);
            }).setCaption("");
于 2019-06-04T12:52:00.013 回答
0

好的,我花了很长时间才弄清楚这一点。我不知道你为什么需要这个,但如果你的目的是找到点击了哪个网格行,那么你可以通过监听器的事件从你的控件的数据源中获取索引。itemClick

就我而言,我的数据源是一个SQLContainer,并且我已经有了它(参见dsvar),所以我这样做了:

grid.addListener(new ItemClickEvent.ItemClickListener() {
    @Override
    public void itemClick(ItemClickEvent event) {               
        Object itemId = event.getItemId();
        int indexOfRow = ds.indexOfId(itemId);                      
    }       
});

通常在初始化控件时,通过构造函数或设置属性将数据源添加到控件中。如果你从某个已经附加了数据源的地方得到了 Grid,你总是可以用这样的东西得到它:

SQLContainer ds = (SQLContainer)gred.getContainerDataSource();
于 2016-12-29T10:44:23.097 回答