예제 #1
0
 /// <summary>
 /// 添加TempNode到双亲表(默认情况是将entry.DataSerialization赋给tempRow[Conductor.TableBuilder.DataSerialization]列)
 /// </summary>
 /// <param name="treeTableBuilder">双亲表Builder</param>
 /// <param name="NodeLevel">分组等级(从0开始)</param>
 /// <param name="tempRow">双亲表目标行</param>
 /// <param name="entry">待添加TempNode对象</param>
 public virtual void onAddNodeEntryToDataRow(TreeTableBuilder treeTableBuilder, int NodeLevel, DataRow tempRow, TempNodeEntry entry)
 {
     tempRow[Conductor.TableBuilder.DataSerialization] = entry.DataSerialization;
 }
예제 #2
0
        public override void onCreateTreeTable(TreeTableConductor invorker)
        {
            int           selfID = 1;
            ISet <string> sets   = new HashSet <string>();
            Dictionary <int, List <TempNodeEntry> > tempDict2 = new Dictionary <int, List <TempNodeEntry> >();
            //判别使用的是分组事件还是分组接口
            int groupCount = 0;

            if (IsUseEctarctEvent)
            {
                //添加分组字段提取器事件
                if (ExtractEvents != null)
                {
                    foreach (Delegate d in ExtractEvents.GetInvocationList())
                    {
                        ExtractEvents -= d as Del_ExtractGroupFieldValue <T>;
                    }
                }
                onBlindExtractEvent();
                groupCount = ExtractEvents.GetInvocationList().Count();
            }
            else
            {
                //添加分组字段提取器接口
                if (Extractors != null)
                {
                    Extractors.Clear();
                }
                Extractors = new List <IGroupFieldExtractor <T> >();
                onAddDataExtract(Extractors);
                groupCount = Extractors.Count();
            }

            TreeTableUtils tableUtils = invorker.convertToTreeTableUtils();

            //开始分等等级遍历
            for (int NodeLevel = 0; NodeLevel < groupCount; NodeLevel++)
            {
                //按照指定的分组方法,对每一各分组字段进行获取
                foreach (T item in DataList)
                {
                    string[] tags = new string[NodeLevel + 1];
                    if (IsUseEctarctEvent)
                    {
                        for (int index = 0; index < tags.Length; index++)
                        {
                            tags[index] = ExtractEvents.GetInvocationList()[index].DynamicInvoke(item).ToString();
                        }
                    }
                    else
                    {
                        for (int index = 0; index < tags.Length; index++)
                        {
                            tags[index] = Extractors[index].onExtractGroupFieldValue(item);
                        }
                    }

                    string tag      = onFormatTag(tags);
                    int    parentID = Tag_RootIndex;

                    if (NodeLevel != 0)
                    {
                        DataRow temp = tableUtils.FindNodeByTag(onFormatTag(tags.Take(NodeLevel).ToArray()));
                        if (temp == null)
                        {
                            continue;
                        }
                        parentID = int.Parse(temp[invorker.TableBuilder.SelfID].ToString());
                    }

                    if (tempDict2.Keys.Contains(parentID) == false)
                    {
                        tempDict2.Add(parentID, new List <TempNodeEntry>());
                    }

                    if (sets.Contains(tag) == false)
                    {
                        TempNodeEntry entry = new TempNodeEntry();
                        entry.Tag   = tag;
                        entry.Value = tags[NodeLevel];
                        onCustomTempNodeEntry(ref entry, item, NodeLevel);
                        tempDict2[parentID].Add(entry);
                        sets.Add(tag);
                    }
                }

                foreach (int Key_parentID in tempDict2.Keys)
                {
                    foreach (var value_entry in SortTempNodeEntryBeforeAddToTree(tempDict2[Key_parentID], NodeLevel, Key_parentID))
                    {
                        DataRow tempRow = Conductor.ResultTable.NewRow();
                        tempRow[Conductor.TableBuilder.SelfID]   = selfID++;
                        tempRow[Conductor.TableBuilder.Value]    = value_entry.Value;
                        tempRow[Conductor.TableBuilder.ParentID] = Key_parentID;
                        tempRow[Conductor.TableBuilder.Tag]      = value_entry.Tag;
                        //支持有其他属性的添加
                        onAddNodeEntryToDataRow(Conductor.TableBuilder, NodeLevel, tempRow, value_entry);
                        //添加到数据表
                        Conductor.ResultTable.Rows.Add(tempRow);
                    }
                }
                sets.Clear();
                tempDict2.Clear();
            }
        }
예제 #3
0
 /// <summary>
 /// 依据item对临时节点对象entry进行调整
 /// 1. 默认是将item.toString值赋给entry.DataSerialization字段
 /// 2. 原则上除了最后一级节点,不要修改entry的Tage和value值
 /// </summary>
 /// <param name="entry">临时节点对象</param>
 /// <param name="item">填充元素</param>
 /// <param name="NodeLevel">分组等级(从0开始)</param>
 public virtual void onCustomTempNodeEntry(ref TempNodeEntry entry, T item, int NodeLevel)
 {
     entry.DataSerialization = item.ToString();
 }