2009-03-23 5 views
0

À l'aide de Winforms .NET 2.0, mon client a demandé que les données d'une Datagrid soient affichées verticalement plutôt qu'horizontalement. La couche de données de l'application est construite sur NHibernate, donc j'évite généralement d'écrire du SQL brut en faveur de HQL. Toutefois, ce scénario peut se prêter à l'utilisation de la fonctionnalité 'crosstab' de SQL Server 2005.Données 'Rotate' dans une grille de données WinForms

Ainsi, par exemple, la disposition gridview actuelle (qui reflète la conception de table) est liée à un IList (de ClaimGroup) en tant que tel:

 

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

doit devenir:

 

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

la grille a actuellement, et il faudra encore, un bouton « Appliquer » qui enregistrera les modifications apportées à la grille pivotée.

Alors, que feriez-vous? Utiliser le SQL brut pour croiser les données, rompant ainsi la loi NHibernate d'éviter les requêtes spécifiques à la base de données? Ou existe-t-il un mécanisme intégré dans un DataSet qui permettrait de faire pivoter les données? Ou simplement utiliser la force brute pour faire pivoter les données?

grâce à l'avance

Répondre

0

J'ai la même exigence de faire tourner une grille comme je l'répliquez QueryWizard dans ASP.NET et les données sont plus faciles à gérer basculée sur le côté. Mon prototype se composait d'un répéteur qui rejetait la rangée sur des rangées verticales, mais le formatage est un peu brouillon si vous avez des longueurs de données imprévisibles car les tables doivent avoir une hauteur de ligne, une largeur et un débordement: caché pour apparaître en uniforme . - mais je suppose qu'un simple nobr suffirait.

<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> 

Mon plan d'attaque pour lundi était de passer outre la méthode render GridView et ensuite en boucle les lignes de les rendre au besoin. Je vais poster de nouveau à vous faire connaître mes progrès

pseudocode - quelque chose comme

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

En laissant la cellule gérer la vous ne devriez pas avoir rendu à faire quelque chose de différent avec la liaison ou le ViewState.

1

J'utiliserais le mode virtuel du datagridview.
propriété VirtualMode = True

Lorsque vous avez fethed les données sous forme normale
Créer les 2 colonnes et préparer les datagridview

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

mettre en œuvre maintenant l'événement "CellValueNeeded" ..

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

Utilisez rowindex et columnindex pour définir la valeur qui doit être affichée.
Vous connaissez la propriété basée sur rowvalue et la ligne basée sur la valeur de la colonne.

0

Avez-vous envisagé d'utiliser DataList au lieu de DataGridView?

Questions connexes