使用Apache Wicket填充表格

4
我需要动态地像这样填充一个表格。问题是,这并不是一个简单的表格,它具有“rowspan”的特性。
对于一个条目,有多个字段条目被存储在不同的行中。
使用Wicket填充这个表格有些棘手。任何帮助、建议和提示都将非常有用。
这就是HTML页面上表格的样子: https://jsfiddle.net/sayrandhri/4ktmy6cn/2/
<table>
    <tr>
        <th>Name</th>
        <th>Role</th>
        <th>Company</th>
        <th>Request</th>
        <th>Change</th>
    </tr>
    <tr>
        <td rowspan=2>ABC</td>
        <td rowspan=2>User</td>
        <td>Y</td>
        <td>True</td>
        <td>False</td>
    </tr>
    <tr>  
        <td>Telecom</td>
        <td>True</td>
        <td>False</td>
    </tr>
      <tr>
        <td rowspan=3>XYZ </td>
        <td rowspan=3>User</td>
        <td>O </td>
        <td>False</td>
        <td>False</td>
    </tr>
    <tr>  
        <td>Q</td>
        <td>True</td>
        <td>True</td>
    </tr>
     <tr>  
        <td>R</td>
        <td>False</td>
        <td>False</td>
    </tr>
</table>
3个回答

2
您可以尝试以下方法:
HTML:
<table>
    <tr>
        <th>Name</th>
        <th>Role</th>
        <th>Company</th>
        <th>Request</th>
        <th>Change</th>
    </tr>
    <tbody wicket:id="userList">
        <tr wicket:id="providerList">
            <td wicket:id="userName"></td>
            <td wicket:id="roleName"></td>
            <td wicket:id="provider"></td>
            <td wicket:id="request"></td>
            <td wicket:id="change"></td>
        </tr>
    </tbody>
</table>

Java:

add(new ListView<User>("userList", new PropertyModel<>(this, "users")) {

    @Override
    protected void populateItem(ListItem<User> listItem) {
        final User user = listItem.getModelObject();
        listItem.add(new ListView<Provider>("providerList", user.getProviders()) {

            @Override
            protected void populateItem(ListItem<Provider> listItem) {
                final Provider provider = listItem.getModelObject();

                Label nameLabel = new Label("userName", user.getName());
                Label roleNameLabel = new Label("roleName", user.getRoleName());
                listItem.add(nameLabel);
                listItem.add(roleNameLabel);

                if (user.getProviders().indexOf(provider) == 0) {
                    AttributeAppender attributeAppender =
                            AttributeAppender.append("rowspan", user.getProviders().size());
                    nameLabel.add(attributeAppender);
                    roleNameLabel.add(attributeAppender);
                } else {
                    nameLabel.setVisible(false);
                    roleNameLabel.setVisibilityAllowed(false);
                }

                listItem.add(new Label("provider", provider.getName()));
                listItem.add(new Label("request", provider.isRequest()));
                listItem.add(new Label("change", provider.isChange()));
            }
        });
    }
});

请注意,如果没有任何供应商,用户将根本不会出现在列表中。

0

wicket:container可以解决这个问题。

你的HTML文件将会是这样的:

<wicket:container wicket:id="doubleRow">
<tr>
    ...
    First Row components
    ...
</tr>
<tr>  
    ...
    Second Row components
    ...
</tr>
</wicket:container>

0
假设您正在使用具有列的DataTable: 在跨越多行的单元格中,您使用模型设置rowspan属性。只要该单元格的值不变,该模型中的值将增加。
一旦检测到内容的变化,您将创建一个新的模型,其rowspan值为1,并将其再次分配给当前单元格。
可能会像这样做,但我目前无法测试:
private IModel<Integer> currentRowSpanModel = new Model<>(0);
...

    new AbstractColumn<Object, String>(new Model<>("ColumnWithRowSpan")) {

        @Override
        public void populateItem(Item<ICellPopulator<Object>> cellItem, String componentId, IModel<Object> rowModel) {

            if (/*Content of cell has changed compared to last row*/) {
                // write the content to the cell and add the rowspan Attribute
                cellItem.add(new Label(componentId, "Content"));
                currentRowSpanModel = new Model<>(1);
                cellItem.add(AttributeModifier.replace("rowspan", currentRowSpanModel));

            } else {
                // Hide cell with same content and instead increase rowspan
                cellItem.add(new WebMarkupContainer(componentId));
                cellItem.setVisible(false);
                currentRowSpanModel.setObject(currentRowSpanModel.getObject()+1);
            }
        }
    }

现在我不知道如何将你的代码适应我的需求。 - Madhavi Jouhari

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