如何在Wicket DataTable中插入“子行”

8

我有一个 AjaxFallbackDefaultDataTable,其中每个测试结果都有一行。测试结果可能会有附带的注释,需要在测试结果下方突出显示,希望得到类似于以下表格的效果:

| Test | Result | Appraisal |
|------|--------|-----------|
|  1   |  20.0  |   PASS    |
|  2   |  1.50  |   FAIL    |
| Note: This is an epic fail|
|  3   |  19.4  |   PASS    |
|  4   |  14.9  |   PASS    |

有没有办法使用Wicket DataTable构造实现此行插入(最好是具有列跨度)。当我深入挖掘源代码时,我可以找到Item渲染器,但没有处理行的内容。

目前我有以下内容:

// Create the sortable data provider.
SortableDataProvider<TestResult> provider = new SortableDataProvider<TestResult>() {
    //... hibernate pagination code ...
};

List<IColumn> columns = new ArrayList<IColumn>();
columns.add(new TextFilteredPropertyColumn(new Model<String>("Test"), "test", "test"));
columns.add(new TextFilteredPropertyColumn(new Model<String>("Result"), "result", "result"));
columns.add(new TextFilteredPropertyColumn(new Model<String>("Appraisal"), "appraisal", "appraisal"));

// Create a new AJAX table using the sortable, filtered data provider.
final AjaxFallbackDefaultDataTable dataTable = new AjaxFallbackDefaultDataTable("testResultTable", columns.toArray(new IColumn[0]), provider, 20);// 20 = number of rows per page
2个回答

11

我认为没有一种简单的方法可以做到这一点,你将不得不修改生成的HTML。

我会将自定义行为附加到行上,自动生成所需的HTML,类似于以下代码:

new AjaxFallbackDefaultDataTable<MyCustomObject>(
    id, columns, dataProvider, rowsPerPage){

    @Override
    protected Item<MyCustomObject> newRowItem(String id,
        int index,
        final IModel<MyCustomObject> model){
        Item<MyCustomObject> item = super.newRowItem(id, index, model);
        item.add(new AbstractBehavior(){

            private static final long serialVersionUID = 1L;

            /**
             * {@inheritDoc}
             */
            @Override
            public void onRendered(Component component){
                if(model.getObject().isEpicFail()){
                    component.getResponse().write(
                    "<tr><td colspan=\"3\">This is an epic fail</td></tr>");
                }
            }

        });
        return item;
    }

    private static final long serialVersionUID = 1L;

}

这是绝对正确和非常快速的回复。非常感谢,我已经为这个问题苦恼了一个星期。干杯! - spikeheap
没问题。一旦你理解了Wicket,它实际上很容易,但这需要一些时间。 - Sean Patrick Floyd
渲染自己的HTML有点丑陋:o。但是覆盖newRowItem方法是一个不错的开始,你应该创建一个Panel并将其添加到项目中。 - Rob Audenaerde

0

如果查看类NavigationToolbar(扩展,DataTable),从HTML的角度来看,有一个HTML表格行,对象构造方式非常不同,但结果很好,其他数据以HTML行的形式呈现,而不是Java表中的行(从代码的角度来看,导航器不是对象表的一部分,从这个角度来看是外部的)。

很好的代码片段可以进行分析。

当我的丰富的数据表用于平台来直观地呈现带小计的报告时,我知道这是可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接