在WPF中对分类数据进行分组

时间:2010-04-16 00:25:14

标签: c# wpf listview mvvm reporting

这是我想要做的。

动态类别:

  1. 列可以是0或更多。
  2. 必须包含1个或多个类型列
  3. 仅当任何行包含与其关联的类型列数据时才会显示。
  4. 数据行:

    1. 将添加异步
    2. 将按 Common进行分组 类别列。
    3. 如果是,则会添加动态类别 尚不存在。
    4. 如果有的话,会添加一个类型列 在其适当的范围内尚不存在 动态类别。
    5. 平台信息:

      • WPF
      • .Net 3.5 sp1
      • C#
      • MVVM

      我有一些部分功能原型,但每个原型都有自己的主要问题。你能不能给我一些指导?

      设想这款风格漂亮的款式。 :-)

          --------------------------------------------------------------------------
          |[  Common Category  ]|[ Dynamic Category  0 ]|[   Dynamic Category N   ]|
          --------------------------------------------------------------------------
          |[Header 1]|[Header 2]|[  Type 0  ]|[ Type N ]|[  Type 0   ]|[  Type N  ]|
          --------------------------------------------------------------------------
          |[Data 2 Group]                                                          |
          --------------------------------------------------------------------------
          |  Data A  | Data 2  ||    Null    |  Data 1  ||   Data 0   |  Data 1   ||
          |  Data B  | Data 2  ||   Data 0   |   Null   ||   Data 0   |  Data 1   ||
          --------------------------------------------------------------------------
          |[Data 1 Group]                                                          |
          --------------------------------------------------------------------------
          |  Data C  | Data 1  ||    Null    |  Data 1  ||   Data 0   |  Data 1   ||
          |  Data D  | Data 1  ||    Null    |   Null   ||   Data 0   |   Null    ||
          --------------------------------------------------------------------------
      

      编辑:不需要排序和分页。

      我查看了嵌套的 ListViews DataGrids ,动态构建了一个Grid。动态构建网格并利用 SharedSizeGroup 属性似乎是最有前途的策略,但我对性能感到担忧。

      更好的方法是将此视为动态报告吗?如果是这样,我应该看什么?

      感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

在我看来,你需要一个透视网格控件。

InfragisticsDevExpress

有好消息

编辑,但是,如果你手动完成,我会有这样的事情(从头到尾)

Class Data
   Public Categories() as List
   Public Types() as List
   Public table as list( of row )
End Class

Class Row
   Public Category as string
   Public Type as string
   Public Group as string
   Public Header1 as string
   Public Header2 as string
   Public cell as string
End Class

然后我会编写一个函数,如:(伪代码)

function AddData( Category, Type, Group, theData )
    1. Search if the Category exist in array of categories, else add it
    2. Search if the Type exist in array of Types, else add it 
    3. add the rec
end function 

function DisplayData( )
   //show headers
   For each category in data.categories
      For each Type in data.categories
         AddColumn( Category, Type )
      next
   next
   //get the groups
   for each group in (from g in data.table select g.group).distinct
      for each category in data.categories
         for each type in data.types
            cell = (from r in data.table where r.category = category and r.type = type and r.group = group)
            if cell is nothing then
               addcell("null")
            else
               addcell(cell)
            end if
         next
      next
   next

我认为我留下了可能具有共同类别的几行,但你会得到这个想法 它不是性能最好的,但很容易理解。