2009-03-23 10 views
0

Winforms .NET 2.0を使用しているクライアントは、Datagridのデータを水平ではなく垂直に表示するように要求しています。アプリケーションのデータレイヤーはNHibernate上に構築されているので、私は一般的にHQLを優先して生のSQLを書くことを避けます。ただし、このシナリオは、SQL Server 2005の「クロスタブ」機能を利用するのに役立ちます。たとえば、現在のgridviewレイアウト(テーブルデザインを反映)は、(ClaimGroupの)IListにバインドされています。WinFormsデータグリッドのデータを「回転」

 

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

グリッドが現在持っている、とはまだ、回転グリッドに加えた変更が保存されます「適用」ボタンが必要になります:

 

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

はなっている必要があります。

あなたは何をしますか?生のSQLを使用してデータをクロス集計することで、db固有の問合せを回避するNHibernateの法則を破っていますか?または、データを回転させるためのDataSetに組み込まれているメカニズムがありますか?または、データを回転させるために無理矢理力を使うだけですか?事前

答えて

0

おかげで私はASP.NETでQueryWizardを複製していて、グリッドを回転させるために同じ要件を持っているとのデータがその側に反転し、より管理しやすいです。

私のプロトタイプは、行を垂直行にダンプしたRepeaterで構成されていましたが、テーブルが行の高さ、幅、オーバーフローを設定する必要があるため、予期しないデータ長があるとフォーマットがちょっと乱雑です。 。 - しかし、私は単純な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のレンダリング方法をオーバーライドしてから、必要に応じて行をループさせていました。セルはあなたがバインドまたはViewStateのと違う何かをする必要はありませんレンダリングを処理させることで

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

のようなもの - 私はあなたが私の進捗状況

擬似コードをお知らせするために戻って掲載します。

1

私は、datagridviewの仮想モードを使用します。
プロパティVirtualMode = Trueの

あなたは
通常 などのデータの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 
} 
を2列を作成し、準備をしているfethed

rowindexとcolumnindexを使用して、表示する必要がある値を設定します。
rowvalueに基づくプロパティとcolumnvalueに基づく行が分かります。

0

DataGridViewの代わりにDataListを使用することを検討しましたか?