/// <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; }
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(); } }
/// <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(); }