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

发布于 2024-07-15 19:39:04 字数 689 浏览 6 评论 0原文

使用 Winforms .NET 2.0,我的客户要求数据网格中的数据垂直显示而不是水平显示。 应用程序的数据层是基于 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 避免数据库特定查询的法则? 或者数据集中是否内置了某种允许数据旋转的机制? 或者只是使用暴力来旋转数据?

提前致谢

Using Winforms .NET 2.0, my client has requested that data in a Datagrid be displayed vertically rather than horizontally. The data layer of the app is built upon NHibernate, so I generally avoid writing raw SQL in favor of HQL. However, this scenario may lend itself to utilizing the 'crosstab' functionality of SQL Server 2005.

So for example, the current gridview layout (which mirrors the table design) is bound to an IList(of ClaimGroup) as such:


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

needs to become:


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

The grid currently has, and will still require, an 'Apply' button that will save any changes made to the rotated grid.

So what would you do? Use raw SQL to crosstab the data, thereby breaking the NHibernate law of avoiding db specific queries? Or is there some mechanism built into a DataSet that would allow the data to be rotated? Or just use brute force to rotate the data?

thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你爱我像她 2024-07-22 19:39:04

我会使用 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 来设置需要显示的值。
您知道哪个属性基于行值以及哪个行基于列值。

I would use the virtual mode of the datagridview.
Property VirtualMode = True

When you have fethed the data as normal
Create the 2 columns and prepare the datagridview

DataGridView.Columns.Add("colGroup", "Group");
DataGridView.Columns.Add("colBVH", "BVH");
DataGridView.Rows.Clear();
DataGridView.Rows.Add(6);
DataGridView.CellValueNeeded +=
  new DataGridViewCellValueEventHandler(NeedValue);

Now implement the "CellValueNeeded" event..

private void NeedValue(object sender, DataGridViewCellValueEventArgs e)
{
    e.Value
    e.ColumnIndex
    e.RowIndex
}

Use rowindex and columnindex to set the value that needs to be shown.
You know which property based on rowvalue and which row based on the columnvalue.

ㄟ。诗瑗 2024-07-22 19:39:04

当我在 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 做任何不同的事情。

I have the same requirement to rotate a Grid as I'm replicating the QueryWizard in ASP.NET and the data is more manageable flipped on its side.

My prototype consisted of a Repeater that dumped the row out vertical rows, but formatting is a bit messy if you have unpredictable data lengths as the tables need to have set line-height, width and an overflow:hidden to appear uniformed. - but I guess a simple nobr would suffice.

<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>

My plan of attack for Monday was to override the GridView render method and then loop the Rows to have them render as required. I will post back to let you know my progress

Pseudocode - something like

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

By letting the Cell handle the rendering you shouldn't need to do anything different with Binding or the ViewState.

浅忆流年 2024-07-22 19:39:04

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

Have you considered using DataList instead of DataGridView?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文