У меня есть такое же требование для поворота сетки, как и для репликации QueryWizard в ASP.NET, и данные более управляемы, если перевернуть их на бок.
Мой прототип состоял из повторителя, который выводил строки из вертикальных строк, но форматирование немного запутано, если у вас непредсказуемые длины данных, поскольку в таблицах должны быть заданы высота строки, ширина и переполнение: скрытое, чтобы отображаться в форме. - но я думаю, простого нобра было бы достаточно.
<HeaderTemplate>
<table>
<tr><td>
<table>
<tr><td>ColumnName1</td></tr>
<td><td>ColumnName2</td></tr>
</table>
</td>
</HeaderTemplate>
<ItemTemplate>
<td>
<table>
<tr><td><%# Eval("Column1") %></td></tr>
<tr><td><%# Eval("Column2") %></td></tr>
</table>
</td>
</ItemTemplate>
<FooterTemplate>
</tr>
</table>
</FooterTemplate>
Мой план атаки на понедельник состоял в том, чтобы переопределить метод рендеринга GridView и затем зациклить строки, чтобы они отображались по мере необходимости. Я отправлю обратно, чтобы сообщить вам о моем прогрессе
псевдокод - что-то вроде
for(int c=0; c < columns.Count; c++)
{
writer.Write("<tr>");
writer.Write("<td>" + columns[c].Title + "</td>");
for(int r=0; r < rows.Count; r++)
{
rows[r].Cells[c].render(writer);
}
writer.Write("</tr>");
}
Позволяя ячейке обрабатывать рендеринг, вам не нужно делать ничего другого с Binding или ViewState.