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

来源:互联网 发布:阿里云域名登录 编辑:程序博客网 时间:2024/05/22 15:09

先上图,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
原创粉丝点击