请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

CanYou8

银牌会员

67

主题

191

帖子

2047

积分

银牌会员

积分
2047

活字格认证微信认证勋章元老葡萄

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


.xaml.cs文件部分
  1.         private void OrderDataGrid_AutoGeneratingColumn(object sender, C1.WPF.DataGrid.DataGridAutoGeneratingColumnEventArgs e)
  2.         {
  3.             if (e.Property.Name == "ProductQuantity")
  4.             {
  5.                 DataGridAggregate.SetAggregateFunctions(e.Column,
  6.                     new DataGridAggregatesCollection
  7.                     {
  8.                         new DataGridAggregateSum { ResultFormat = "SUM = {0}" },
  9.                         new DataGridAggregateAvg { ResultFormat = "AVG = {0}" },
  10.                     });
  11.             }
  12.         }
复制代码

7 个回复

倒序浏览
Alice
社区贡献组   /  发表于:2015-12-3 10:43:00
沙发
回复 1楼CanYou8的帖子

谢谢您提供的代码。
我测试后给您反馈。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
CanYou8
银牌会员   /  发表于:2015-12-9 13:49:00
板凳
问下 我这个问题进展如何?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-12-9 15:14:00
地板
回复 3楼CanYou8的帖子

很抱歉回复晚了。
针对您的问题,有一个解决方案:给绑定的Model里的字段添加相应的属性。
比如,你不想让某列显示出来,就在相应的属性上加上displayattribute,把autogeneratefield设置为false。
举个例子,不想显示Model里的字段CretedOnStr,代码参考:
  1. [Display(AutoGenerateField = false)]
  2.         public DateTime CreatedOnStr
复制代码
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
CanYou8
银牌会员   /  发表于:2015-12-9 16:43:00
5#
在Model里做标记是一种方案,但需逐一修改Model里面的每一个不想显示的属性。这样做感觉可维护性不好,改动挺多不易推广;而且显示的列将来会有变化,我们甚至在考虑动态配置列的显示与否。
这种需求,必须用后台事件方式来配合实现吗?能否不用C1DataGrid 的 AutoGeneratingColumn事件,用其他的事件呢?
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-12-9 17:57:00
6#
回复 5楼CanYou8的帖子

是的,目前研发组给的建议是采用4楼标记的方式。
C1DataGrid触发的就是AutoGeneratingColumn事件。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
CanYou8
银牌会员   /  发表于:2015-12-10 10:34:00
7#
这个问题的答复,不是很满意。给出的建议和方案,可行性很低:一来做起来繁琐,最主要的是很多Model是共用的,会绑定到一个以上的列表。C1.WPF.DataGrid.Summaries 所提供的功能基本没法用,我再想想办法吧
回复 使用道具 举报
Alice
社区贡献组   /  发表于:2015-12-10 11:52:00
8#
回复 7楼CanYou8的帖子

谢谢您的反馈。
您的意见我收到了,我会提交给产品组。
请点击评分,对我的服务做出评价!  5分为非常满意!

葡萄城控件服务团队

官方网站: http://www.gcpowertools.com.cn
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部