我有一个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处理程序而非锚点(&lt; a href =“...”/&gt;)标记的单元格。我想要锚标签有几个原因,其中一个原因是我想添加自己的onclick处理程序而不需要现有的onclick处理程序。
我已经看到了一个普遍接受的解决方案,即在HTML标记的面板中放置一个锚标签,并在Panel子类中添加链接。但是,这并没有给出整个html标记(在表格内),我认为column()标签必须是这个标记的一部分,我认为这与我动态生成列的策略无关(I甚至不知道或关心会有多少人被要求)。有没有办法将动态生成的列渲染为锚标记,而无需在标记中指定多少个?
感谢您的帮助。
答案 0 :(得分: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);