RadPivotFieldList 如何给 choose fields 分组/层次显示

先上图,RadPivotFieldList 最终效果如下:


View :

<pivot:RadPivotFieldList Name="PivotFieldList" DataProvider="{Binding PivotDataSrcProvider,Mode=TwoWay}" />

ViewModel:

private LocalDataSourceProvider pivotDataSrcProvide;
        public LocalDataSourceProvider PivotDataSrcProvider 
        {
            get
            {
                return pivotDataSrcProvide;
            } 
            set 
            {
                pivotDataSrcProvide = value;
                RaisePropertyChanged(() => PivotDataSrcProvider);
            } 
        }

需要设置 PivotDataSrcProvider.ItemsSource ,它是一个 DataSet,DataTable 是这样定义 columns 的:
var dt = new DataTable();

            #region shipment route
            //origin/pol
            dt.Columns.Add(new DataColumn("Shipment Route.Origin/POL.Origin/POL Country", typeof(string)) { Caption = "Origin/POL Country" });
            dt.Columns.Add(new DataColumn("Shipment Route.Origin/POL.Origin/POL Code", typeof(string)) { Caption = "Origin/POL Code" });
            //via / pod
            dt.Columns.Add(new DataColumn("Shipment Route.Via / POD.Via / POD Country", typeof(string)) { Caption = "Via / POD Country" });
            dt.Columns.Add(new DataColumn("Shipment Route.Via / POD.Via / POD Code", typeof(string)) { Caption = "Via / POD Code" });
            //destination
            dt.Columns.Add(new DataColumn("Shipment Route.Destination.Destination Country", typeof(string)) { Caption = "Destination Country" });
            dt.Columns.Add(new DataColumn("Shipment Route.Destination.Destination Code", typeof(string)) { Caption = "Destination Code" });


            dt.Columns.Add(new DataColumn("Shipment Route.Flight No", typeof(string)) { Caption = "Flight No" });
            
            #endregion
我们需要的分组在 column name 里面,Shipment Route.Destination.Destination Country,在这里还只是字符串,让它在 choose fields 里面变成分组显示的关键代码在这里:

            var nodetree = new Dictionary<string, ContainerNode>();
            var fdprovider = new LocalDataSourceFieldDescriptionsProvider();
            fdprovider.AddingContainerNode+= (sender, e) =>
            {
                var namepath = string.Empty;
                var names = (e.ContainerNode.Name ?? string.Empty).Split('.').Where(c => !string.IsNullOrEmpty(c))
                    .Reverse().Skip(1).Reverse();
                var leaf = e.ContainerNode;
                ContainerNode curnode = null;
                foreach (var name in names)
                {
                    namepath += name + ".";
                    ContainerNode existingnode;
                    if (!nodetree.TryGetValue(namepath, out existingnode))
                    {
                        var subnode = new ContainerNode(name, ContainerNodeRole.Folder);
                        nodetree[namepath] = subnode;
                        if (curnode == null)
                        {
                            curnode = subnode;
                            e.ContainerNode = curnode;
                        }
                        else
                        {
                            curnode.Children.Add(subnode);
                            curnode = subnode;
                        }
                    }
                    else
                    {
                        e.Cancel = true; // folder already exist in tree
                        curnode = existingnode;
                    }


                }
                if (curnode != null)
                {
                    curnode.Children.Add(leaf);
                }
            };
            PivotDataSrcProvider.FieldDescriptionsProvider = fdprovider;
            PivotDataSrcProvider.ItemsSource = data;

到这里需要的代码就差不多完成了。

下面说明一下 DataTable 定义 columns 时附加 caption 的意义, 添加 columns 时,有 column name 和 type 就够了,有没有 caption 都没所谓的,但是不设 caption 的话,默认会用 column name 作 caption,这样 choose fields 以及选中字段以后的 row labels 里面,我们看到的字段会是很长一串字符,而在 PivotDataSrcProvider 里面想改caption 非常困难(至少我没有找到合适的方法来设置caption),所以如果只想显示最终字段名就在 DataTable 里面设一下 column 的 caption ,这是目前最简洁的办法了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值