Roman
Roman

Reputation: 127

XPages. Hide column in DataTable

I'm trying to hide a column in the dataTable, but not working. Hiding only header. In example I try hide first column. Domino 9.0.1.

I was mistaken or is it a bug?

I know about the "display: none" for the column, but I have a lot of data, and not rendered column save my local performance

<xp:dataTable id="dataTable1" rows="30" var="item">
    <xp:this.value><![CDATA[#{javascript:var collection = [];
        for( var i = 0; i < 10; i++ ) {
            var obj = {};
            obj.name = "Name" + i;
            obj.key = "Key" + i;
            collection.push( obj );
        }
        return collection;}]]></xp:this.value>
    <xp:column id="column1" rendered="false">
        <xp:this.facets>
            <xp:span xp:key="header">Name</xp:span>
        </xp:this.facets>
        <xp:text escape="true" id="computedField1"
            value="#{item.name}">
        </xp:text>
    </xp:column>
    <xp:column id="column2">
        <xp:this.facets>
            <xp:span xp:key="header">Key</xp:span>
        </xp:this.facets>
        <xp:text escape="true" id="computedField2" value="#{item.key}"></xp:text>
    </xp:column>
</xp:dataTable>

Upvotes: 0

Views: 427

Answers (1)

Eric McCormick
Eric McCormick

Reputation: 2733

I can confirm I get exactly the same behavior out of this. I agree that I would expect the entire column to not render, but that's apparently not its behavior. I've always viewed the xp:dataTable control as a slightly dressed up xp:repeat, but not with as much window dressing as an xp:viewPanel control and the Domino Designer wiki page on xp:dataTable isn't exactly helpful for any of the specifics and my Mastering XPages 2nd ed. also doesn't go too far into detail on xp:dataTable.

It's also worth noting that also setting the rendered property on your xp:text field still builds out the first cell in each row, regardless of the first <th> being suppressed. I'm guessing there's something in the way the xp:dataTable control builds out the HTML elements that's funky.

My recommendation would be to switch to an xp:repeat control, which will give you more control over the entire process. Adapting your code, it would go somewhat like this:

    <xp:table>
        <xp:tr>
            <xp:td>Name</xp:td>
            <xp:td>Key</xp:td>
        </xp:tr>
        <xp:repeat
            id="repeat1"
            rows="30"
            var="item">
            <xp:this.value><![CDATA[#{javascript:var collection = [];
for( var i = 0; i < 10; i++ ) {
    var obj = {};
    obj.name = "Name" + i;
    obj.key = "Key" + i;
    collection.push( obj );
}
return collection;}]]></xp:this.value>
            <xp:tr>
                <xp:td
                    rendered="false">
                    <xp:text
                        escape="true"
                        id="computedField1"
                        value="#{item.name}">
                    </xp:text>
                </xp:td>
                <xp:td>
                    <xp:text
                        escape="true"
                        id="computedField2"
                        value="#{item.key}">
                    </xp:text>
                </xp:td>
            </xp:tr>
        </xp:repeat>
    </xp:table>

Do note that to also set the rendering property of the cell being used as the header label (in place of a <th> it will render as a <td>), you'll need to manage that property visibility separately.

Upvotes: 3

Related Questions