| Tweet |
One issue that crops up repeatedly on the SalesForce Developer Discussion Boards is how to rotate a table. E.g. if I have a table that displays account information one account per row:
how can I rotate this to display one account per column:
First, to create a class to model the data that is being passed back to the
page. In this case the class wraps a row of data, thus row 1 contains the name
of each account, row2 contains the street address etc.
As each cell in the table is a text field, our class can simply wrap a list of
String primitives. The class implementation is shown below:
public class RowWrapper
{
// the values (cells) making up this row
public List<String> values {get; set;}
// constructor
public RowWrapper()
{
values=new List<String>();
}
// append a value (cell) to the row
public void addValue(String value)
{
values.add(value);
}
}
The next step is to write an extension to the Account standard controller that transforms a list of Accounts into a list of RowWrapper classes.
// retrieves the list of accounts backing the page
public List<Account> getAccounts()
{
if (null==accs)
{
accs=[select id, Name, BillingStreet, BillingCity, BillingPostalCode from Account
where BillingCity != null and BillingPostalCode!=null limit 3];
}
return accs;
}
// retrieves the list of row wrappers
public List<RowWrapper> getRowWrappers()
{
if (null==rows)
{
rows=new List<RowWrapper>();
// create a row for each field - there are 4 of these, Name, Street, City and PostCode
for (Integer idx=0; idx<4; idx++)
{
rows.add(new RowWrapper());
}
// iterate the accounts and populate the rows
for (Integer idx=0; idx<getAccounts().size(); idx++)
{
rows[0].addValue(getAccounts()[idx].Name);
rows[1].addValue(getAccounts()[idx].BillingStreet);
rows[2].addValue(getAccounts()[idx].BillingCity);
rows[3].addValue(getAccounts()[idx].BillingPostalCode);
}
}
return rows;
}
The final step is to create a VisualForce page to iterate the RowWrapper list
and output the table:
<table class="list" border="0" cellpadding="0" cellspacing="0">
<tr class="headerRow ">
<apex:repeat value="{!headWrap.values}" var="heading">
<th class="headerRow ">
{!heading}
</th>
</apex:repeat>
</tr>
<apex:repeat value="{!rowWrappers}" var="row">
<tr>
<apex:repeat value="{!row.values}" var="value">
<td>
{!value}
</td>
</apex:repeat>
</tr>
</apex:repeat>
</table>
The page and controller can be downloaded here. Simply unzip into the src directory of your Force.com project in the IDE.