使用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中的机制允许数据被旋转?或者只是使用强力来旋转数据?
提前致谢
答案 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?