CanYou8 发表于 2015-12-2 23:05:00

C1DataGrid的统计问题

需求:对C1DataGrid某列进行统计并显示在C1DataGrid最后一行
尝试:参考样例GrandTotal,采用C1.WPF.DataGrid.Summaries中的DataGridAggregateSum方法等,实现了合计并显示的效果
问题:采用C1DataGrid 的 AutoGeneratingColumn事件,调用合计方法时,必须设置AutoGenerateColumns="True"。但是这样会使列表绑定的Model里面所有的属性全部显示到列表上了,请问如何避免呢?
控件:Studio for WPF
主要代码:
.xaml.文件部分
                <c1:C1DataGrid Grid.Row="3" Name="OrderDataGrid" IsReadOnly="True"
                            ColumnHeaderHeight="35" CanUserAddRows="False" CanUserEditRows="False"
                            ItemsSource="{Binding OrderList}" AutoGenerateColumns="True"
                            FrozenBottomRowsCount="1" AutoGeneratingColumn="OrderDataGrid_AutoGeneratingColumn" >
                  <c1:C1DataGrid.Columns>
                        <c1:DataGridTextColumn Header="订单号" Binding="{Binding COSourceNo}" MinWidth="90"/>
                        <c1:DataGridTextColumn Header="订单类型" Binding="{Binding OrderTypeStr}"MinWidth="80"/>
                        <c1:DataGridTextColumn Header="产品规格" Binding="{Binding Piece}" MinWidth="120"/>
                        <c1:DataGridTextColumn Header="产品数量" Binding="{Binding ProductQuantity}" MinWidth="70"/>
                        <c1:DataGridTextColumn Header="总面积" Binding="{Binding ProductTotalArea}" MinWidth="80"/>
                        <c1:DataGridTextColumn Header="下单时间" Binding="{Binding CreatedOnStr}" MinWidth="100"/>
                  </c1:C1DataGrid.Columns>
                  <c1:C1DataGrid.BottomRows>
                        <c1:DataGridSummaryRow/>
                  </c1:C1DataGrid.BottomRows>
                </c1:C1DataGrid>

.xaml.cs文件部分
      private void OrderDataGrid_AutoGeneratingColumn(object sender, C1.WPF.DataGrid.DataGridAutoGeneratingColumnEventArgs e)
      {
            if (e.Property.Name == "ProductQuantity")
            {
                DataGridAggregate.SetAggregateFunctions(e.Column,
                  new DataGridAggregatesCollection
                  {
                        new DataGridAggregateSum { ResultFormat = "SUM = {0}" },
                        new DataGridAggregateAvg { ResultFormat = "AVG = {0}" },
                  });
            }
      }

Alice 发表于 2015-12-3 10:43:00

回复 1楼CanYou8的帖子

谢谢您提供的代码。
我测试后给您反馈。

CanYou8 发表于 2015-12-9 13:49:00

问下 我这个问题进展如何?

Alice 发表于 2015-12-9 15:14:00

回复 3楼CanYou8的帖子

很抱歉回复晚了。
针对您的问题,有一个解决方案:给绑定的Model里的字段添加相应的属性。
比如,你不想让某列显示出来,就在相应的属性上加上displayattribute,把autogeneratefield设置为false。
举个例子,不想显示Model里的字段CretedOnStr,代码参考:

      public DateTime CreatedOnStr

CanYou8 发表于 2015-12-9 16:43:00

在Model里做标记是一种方案,但需逐一修改Model里面的每一个不想显示的属性。这样做感觉可维护性不好,改动挺多不易推广;而且显示的列将来会有变化,我们甚至在考虑动态配置列的显示与否。
这种需求,必须用后台事件方式来配合实现吗?能否不用C1DataGrid 的 AutoGeneratingColumn事件,用其他的事件呢?

Alice 发表于 2015-12-9 17:57:00

回复 5楼CanYou8的帖子

是的,目前研发组给的建议是采用4楼标记的方式。
C1DataGrid触发的就是AutoGeneratingColumn事件。

CanYou8 发表于 2015-12-10 10:34:00

这个问题的答复,不是很满意。给出的建议和方案,可行性很低:一来做起来繁琐,最主要的是很多Model是共用的,会绑定到一个以上的列表。C1.WPF.DataGrid.Summaries 所提供的功能基本没法用,我再想想办法吧

Alice 发表于 2015-12-10 11:52:00

回复 7楼CanYou8的帖子

谢谢您的反馈。
您的意见我收到了,我会提交给产品组。
页: [1]
查看完整版本: C1DataGrid的统计问题