3

我有一个 DefaultDataTable 以编程方式获取其列。

标记很简单:

        <table wicket:id="dataTable" border="0" cellpadding="1" cellspacing="1" width="90%" />

所有列都是从传入的标签和属性的 LinkedHashMap 动态生成的:

    for (Entry<String, String> entry : entrySet) {
        final String label = entry.getKey();
        final String attribute = entry.getValue();
        columns.add(new PsPropertyColumn(label, attribute) {

            @Override
            public void populateItem(Item cellItem, String componentId, IModel model)
            {
                final Object modelObject = model.getObject();
                final Object value = PropertyResolver.getValue(attribute, modelObject);
                // Add an edit link
                BookmarkablePageLink link = new ...;
                ...
                cellItem.add(link);
            }
        }
    }

    DefaultDataTable table = new DefaultDataTable("dataTable", columns, dataProvider, MAX_ROWS) {
        ...
    }
    add(table);

正如许多帖子所提到的,这被呈现为一个带有 onclick 处理程序的单元格,而不是一个锚 (<a href="..." />) 标记。我想要锚标记有几个原因,一个是我想添加自己的 onclick 处理程序,而不需要现有的 onclick 处理程序。

我已经看到了普遍接受的解决方案,即在 HTML 标记中的面板内放置一个锚标记,并在 Panel 子类内添加链接。但是,这并没有给出整个 html 标记(在表格内),而且我认为 column () 标记必须是这个标记的一部分,我认为这不适用于我动态生成列的策略(我甚至不知道或关心会要求多少)。有没有办法将我的动态生成的列呈现为锚标记而不在标记中指定有多少?

感谢您的任何帮助。

4

1 回答 1

0

我使用嵌套的 ListView 组件能够更好地控制布局,如下所示:

html:

<table wicket:id="listViewContainer">
    <tr>
        <th wicket:id="columnHeaderListView">
            <span wicket:id="columnHeaderLabel">Header Label</span>
        </th>
    </tr>
    <tr wicket:id="rowListView">
        <td wicket:id="rowColumnListView">
            <a href="#" wicket:id="link">
                <span wicket:id="linkLabel">Link Label</span>
            </a>
        </td>
    </tr>
</table>

爪哇:

WebMarkupContainer listViewContainer = new WebMarkupContainer("listViewContainer");
listViewContainer.setOutputMarkupId(true);
add(listViewContainer);

ListView columnHeaderListView = new ListView("columnHeaderListView", columnHeaderList) {
    @Override
    protected void populateItem(ListItem listItem) {
        ColumnHeader ch = (ColumnHeader) listItem.getModelObject();
        listItem.add(new Label("columnHeaderLabel", new Model(ch.getLabel())));
    }
};
listViewContainer.add(columnHeaderListView);

ListView rowListView = new ListView("rowListView", rowList) {
    @Override
    protected void populateItem(ListItem listItem) {
        Row row = (Row) listItem.getModelObject();
        listItem.add(new ListView("rowColumnListView", getRowColumnList(row)){
            @Override
            protected void populateItem(ListItem li) {
                RowColumn rowColumn = (RowColumn) li.getModelObject();
                Link link = new BookmarkablePageLink("link",...
                li.add(link);
                link.add(new Label("linkLabel", new Model(rowColumn.getLabel())));
            }
        });
    }
}
listViewContainer.add(rowListView);
于 2013-05-24T16:47:20.157 回答