2009-03-23 4 views
0

Используя Winforms .NET 2.0, мой клиент запросил, чтобы данные в Datagrid отображались вертикально, а не горизонтально. Уровень данных приложения построен на NHibernate, поэтому я обычно избегаю писать исходный SQL в пользу HQL. Однако этот сценарий может прибегнуть к использованию функциональных возможностей «кросс-таблицы» SQL Server 2005.«Поворот» данных в datagrid WinForms

Так, например, текущий макет gridview (который отражает дизайн таблицы) привязан к IList (из ClaimGroup) как таковой:

 

GroupName | ClaimType | PlanCode | AgeFrom | AgeTo | AgeSpan
BHFTConv 1| P | CC | 6 | 12 | Years

должен стать:

 

GroupName | BHFTConv 1 
ClaimType | P 
PlanCode | CC 
AgeFrom | 6 
AgeTo  | 12 
AgeSpan | Years 
 

сетки в настоящее время, и по-прежнему будет требовать, кнопки «Применить», который сохранит любые изменения, сделанные в повернутую сетку.

Итак, что бы вы сделали? Использовать необработанный SQL для кросс-таблицы данных, тем самым нарушая закон NHibernate, избегая конкретных запросов db? Или есть какой-то механизм, встроенный в DataSet, который позволит вращать данные? Или просто используйте грубую силу для поворота данных?

заранее спасибо

ответ

0

У меня есть такое же требование, чтобы вращать сетку, как я тиражирование QueryWizard в ASP.NET и данные более управляемым переворачивается на бок.

Мой прототип состоял из ретранслятора, который сбрасывал строки по вертикальным строкам, но форматирование немного беспорядочно, если у вас есть непредсказуемые длины данных, поскольку в таблицах должны быть заданы высота линии, ширина и переполнение: скрытые, чтобы появляться в форме , - но я предполагаю, что простой nobr хватит.

<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>"); 
} 

Позволяя Cell обрабатывать рендеринг вам не нужно делать что-то другое с Binding или в ViewState.

1

Я бы использовал виртуальный режим datagridview.
VirtualMode Свойство = True

Когда вы fethed данные как нормальный
создать 2 колонки и подготовить DataGridView

DataGridView.Columns.Add("colGroup", "Group"); 
DataGridView.Columns.Add("colBVH", "BVH"); 
DataGridView.Rows.Clear(); 
DataGridView.Rows.Add(6); 
DataGridView.CellValueNeeded += 
    new DataGridViewCellValueEventHandler(NeedValue); 

Теперь реализовать "CellValueNeeded" событие ..

private void NeedValue(object sender, DataGridViewCellValueEventArgs e) 
{ 
    e.Value 
    e.ColumnIndex 
    e.RowIndex 
} 

Используйте rowindex и columnindex, чтобы установить значение, которое должно отображаться.
Вы знаете, какое свойство основано на rowvalue и какая строка основана на значении столбца.

0

Вы рассматривали использование DataList вместо DataGridView?

Смежные вопросы