在WinForms数据网格中“旋转”数据

时间:2009-03-23 20:42:35

标签: .net sql-server crosstab

使用Winforms .NET 2.0,我的客户端已请求Datagrid中的数据垂直显示而不是水平显示。应用程序的数据层是基于NHibernate构建的,因此我通常避免编写原始SQL而使用HQL。但是,这种情况可能有助于利用SQL Server 2005的“交叉表”功能。

例如,当前的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避免数据库特定查询的规律?或者是否有一些内置于DataSet中的机制允许数据被旋转?或者只是使用强力来旋转数据?

提前致谢

3 个答案:

答案 0 :(得分: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设置需要显示的值 您知道哪个属性基于rowvalue,哪个行基于columnvalue。

答案 1 :(得分: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渲染方法,然后循环Rows以根据需要渲染它们。我会回复以告诉您我的进展

伪代码 - 类似

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不同的事情。

答案 2 :(得分:0)

您是否考虑过使用DataList而不是DataGridView?