0

Winforms .NET 2.0 を使用して、私のクライアントは Datagrid 内のデータを水平ではなく垂直に表示するよう要求しました。アプリのデータ レイヤーは NHibernate に基づいて構築されているため、通常、生の SQL を記述して HQL を優先することは避けています。ただし、このシナリオは、SQL Server 2005 の「クロス集計」機能を利用するのに役立つ場合があります。

たとえば、現在の gridview レイアウト (テーブルのデザインを反映) は、次のように (ClaimGroup の) IList にバインドされます。


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を使用してデータをクロス集計し、DB固有のクエリを回避するNHibernateの法則を破りますか? または、データをローテーションできる DataSet に組み込まれたメカニズムはありますか? それとも、ブルート フォースを使用してデータをローテーションしますか?

前もって感謝します

4

3 に答える 3

1

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

正常にデータを取得したら
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 を使用します。
どのプロパティが行の値に基づいており、どの行が列の値に基づいているかがわかります。

于 2009-03-28T18:00:47.740 に答える
0

ASP.NETでQueryWizardを複製するのと同じように、グリッドを回転させる必要があります。データは、その側でより管理しやすくなっています。

私のプロトタイプは、行を垂直行からダンプするリピーターで構成されていましたが、テーブルに行の高さ、幅、オーバーフローを設定する必要があるため、データの長さが予測できない場合、フォーマットは少し面倒です。-しかし、単純な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で何も変更する必要がなくなります。

于 2009-03-28T03:11:05.023 に答える