0

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

例如,当前的 gridview 布局(反映表格设计)绑定到 IList(of 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 中的机制允许数据旋转?或者只是使用蛮力来旋转数据?

提前致谢

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 设置需要显示的值。
您知道基于 rowvalue 的属性和基于 columnvalue 的行。

于 2009-03-28T18:00:47.740 回答
0

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

于 2009-03-29T17:50:11.813 回答
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 做任何不同的事情。

于 2009-03-28T03:11:05.023 回答