如何将“子行”插入 Wicket DataTable

Posted

技术标签:

【中文标题】如何将“子行”插入 Wicket DataTable【英文标题】:How to insert 'sub-rows' into a Wicket DataTable 【发布时间】:2011-04-18 20:24:20 【问题描述】:

我有一个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

【问题讨论】:

【参考方案1】:

我认为没有一种干净的方法可以做到这一点,您将不得不破解生成的 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;


【讨论】:

这既是绝对正确的,也是一个非常快速的回复。非常感谢,过去一周我一直在为这个问题摸不着头脑。干杯! 没有问题。一旦你把头绕在 Wicket 上,它实际上很容易,但这需要一些时间。 渲染自己的 HTML 有点丑:o。但是覆盖 newRowItem 是一个好的开始,您应该创建一个 Panel 并将其添加到项目中。【参考方案2】:

如果看类NavigationToolbar(扩展名,DataTable)从HTML的角度看有一行html表,对象构造有很大不同但结果很好,其他数据在HTML行中没有是有意义的 Java 表中的一行(从代码中导航器不是对象表的一部分,从这样的角度来看是外部的。

很好的片段代码分析

当我丰富的数据数据表将成为直观呈现带有小计的报告的平台时,我知道这将是可能的

【讨论】:

以上是关于如何将“子行”插入 Wicket DataTable的主要内容,如果未能解决你的问题,请参考以下文章

完整性约束违规:1452 无法将子行添加或更新到我的数据库中

Java:如何将值从javascript设置为wicket组件文本字段

如何修复部署到Linux服务器后MySql中的“无法添加或更新子行:外键约束失败”?

完整性约束违规:1452 无法添加或更新子行:

如何将点击处理程序添加到单元格表格构建器的子行

在 wicket 中,如何创建未由组件层次结构/布局定义的 RadioGroup?