/// <summary> /// Create Rows of Header /// Формирует список строк заголовка /// </summary> /// <param name="node"></param> /// <returns>List of Rows</returns> public static List <List <Tuple <FlexNode, int, int> > > GetHeaderRowsForSectionTable(this FlexNode node) { var section = node.GetSectionTemplate(); if (section == null) { return(null); } if (!section.blnGrid) { return(null); } var rows = new List <List <Tuple <FlexNode, int, int> > >(); var depth = 0; var count = 1; GetNodeDepthWidth(node, ref depth, ref count); // add first row of header rows.Add(new List <Tuple <FlexNode, int, int> >()); rows[0].Add(new Tuple <FlexNode, int, int>(node, 1, count)); for (int i = 1; i < depth; i++) { // add one row of header rows.Add(new List <Tuple <FlexNode, int, int> >()); // add items to this row foreach (var tuple in rows[i - 1]) { foreach (var nodeChild in tuple.Item1.ChildList) { if (nodeChild is FlexNode) { int cDepth = 0; int cCount = 1; GetNodeDepthWidth(nodeChild, ref cDepth, ref cCount); rows[i].Add(new Tuple <FlexNode, int, int>(nodeChild as FlexNode, cDepth == 1 ? depth - i : 1, cCount)); } else { } } } } rows.RemoveAt(0); return(rows); }
/// <summary> /// Отыскивает узел, который является секцией с указанным ID /// </summary> /// <param name="node"></param> /// <param name="idfsSection"></param> /// <returns></returns> public static FlexNode FindChildNodeSection(this FlexNode node, long idfsSection) { FlexNode result = null; var section = node.GetSectionTemplate(); if (section != null) { if (section.idfsSection == idfsSection) { result = node; } if ((result == null) && (node.ChildListCount > 0)) { foreach (var nodeChild in node.ChildList) { result = ((FlexNode)nodeChild).FindChildNodeSection(idfsSection); if (result != null) { break; } } } } else { foreach (var nodeChild in node.ChildList) { result = ((FlexNode)nodeChild).FindChildNodeSection(idfsSection); if (result != null) { break; } } } return(result); }
/// <summary> /// Формирует таблицу данных исходя из табличной секции верхнего уровня /// </summary> /// <param name="sectionNode"></param> /// <returns></returns> public static DataTable GetDataTableForSectionTable(this FlexNode sectionNode) { var section = sectionNode.GetSectionTemplate(); if (section == null) { return(null); } if (!section.blnGrid) { return(null); } const string paramKey = "idfsParameter"; const string typeKey = "columnType"; const string widthKey = "width"; const string sectionKey = "idfsSection"; const string parameterTemplateKey = "parameterTemplate"; var resultTable = new DataTable(); //параметры станут столбцами var parameterTemplates = sectionNode.GetParameterTemplateForDataTable(); //TODO проверить, не сломалось ли в других местах //parameterTemplates.Sort(new ParameterTemplateComparer()); var predefinedStubs = sectionNode.GetPredefinedStubsForDataTable(); predefinedStubs.Sort(new PredefinedStubComparer()); var columnInfo = new List <IObject>(); columnInfo.AddRange(predefinedStubs); columnInfo.AddRange(parameterTemplates); var idParameters = sectionNode.GetIDParametersForSection(); var idRowsInStub = new List <long>(); if (section.PredefinedStubRows != null) { foreach (var ps in section.PredefinedStubRows) { if (ps.idfRow.HasValue) { idRowsInStub.Add(ps.idfRow.Value); } } } //формируем остальные столбцы foreach (var columnInfoItem in columnInfo) { //могут быть только числовые или текстовые параметры //боковик не участвует в установке типа var columnName = String.Empty; var nationalName = String.Empty; var type = typeof(String); long idfsParameter = 0; var columnType = 0; //0-ParameterTemplate, 1- PredefinedStub var width = 0; long idfsSection = 0; var parameterTemplate = columnInfoItem as ParameterTemplate; if (parameterTemplate != null) { //для Summary надо отбирать только числовые параметры if (parameterTemplate.IsParameterNumericPositive()) { type = typeof(Double); } else if (parameterTemplate.IsParameterNumeric()) { type = typeof(Int32); } else if (sectionNode.FFModel.IsSummary) { continue; } columnName = GetColumnName(parameterTemplate.idfsParameter);//parameterTemplate.DefaultName; nationalName = parameterTemplate.NationalName; idfsParameter = parameterTemplate.idfsParameter; columnType = 0; width = parameterTemplate.intWidth; if (parameterTemplate.idfsSection.HasValue) { idfsSection = parameterTemplate.idfsSection.Value; } } else { var predefinedStub = columnInfoItem as PredefinedStub; if ((predefinedStub != null) && (predefinedStub.idfsParameter.HasValue)) { columnName = GetColumnName(predefinedStub.idfsParameter.Value);//predefinedStub.strDefaultParameterName; nationalName = predefinedStub.strDefaultParameterName; idfsParameter = predefinedStub.idfsParameter.Value; columnType = 1; width = 80; //?? } } if (idfsParameter > 0) { var column = new DataColumn(columnName, type) { Caption = nationalName }; column.ExtendedProperties.Add(paramKey, idfsParameter); column.ExtendedProperties.Add(typeKey, columnType); column.ExtendedProperties.Add(widthKey, width); column.ExtendedProperties.Add(sectionKey, idfsSection); if (parameterTemplate != null) { column.ExtendedProperties.Add(parameterTemplateKey, parameterTemplate); } resultTable.Columns.Add(column); } } //добавляем специальный столбец с ID строк resultTable.Columns.Add(new DataColumn("idfRow", typeof(Int64)) { Caption = "idfRow" }); //подставляем пользовательские данные if ((sectionNode.ActivityParameters != null) && (sectionNode.ActivityParameters.Count > 0)) { //заполняем сначала все строки var activityParametersAll = sectionNode.ActivityParameters; activityParametersAll.Sort(new ActivityParametersComparer()); var rowList = new List <DataRow>(); foreach (var ap in activityParametersAll) { if (ap.IsMarkedToDelete) { continue; } if (!ap.idfsParameter.HasValue) { continue; } //проверяем, находится ли параметр в этой таблице (может быть как тело таблицы, так и боковик) if (!idParameters.Contains(ap.idfsParameter.Value)) { continue; } //проверяем, чтобы эта строка присутствовала в боковике if (idRowsInStub.Count > 0 && ap.idfRow.HasValue && !idRowsInStub.Contains(ap.idfRow.Value)) { continue; } var row = resultTable.NewRow(); var idfRow = ap.idfRow; var finded = false; foreach (var dataRow in rowList) { if (!idfRow.HasValue) { continue; } if (Convert.ToInt64(dataRow["idfRow"]) == idfRow.Value) { finded = true; break; } } if (finded) { continue; } //if (resultTable.Select(String.Format("idfRow={0}", idfRow)).Length > 0) continue; row["idfRow"] = idfRow; rowList.Add(row); //resultTable.Rows.Add(row); } //теперь распихиваем остальные данные по строкам и столбцам foreach (var row in /*resultTable.Rows*/ rowList) { var idfRow = Convert.ToInt64(row["idfRow"]); var activityParameters = sectionNode.ActivityParameters.Where(ap => ap.idfRow.HasValue && (ap.idfRow.Value == idfRow)).ToList(); if (activityParameters.Count == 0) { continue; } //построчно переносим все значения foreach (DataColumn column in resultTable.Columns) { if ((!column.ExtendedProperties.ContainsKey(typeKey)) || (!column.ExtendedProperties.ContainsKey(paramKey))) { continue; } //var otkey = column.ExtendedProperties[typeKey]; var opkey = column.ExtendedProperties[paramKey]; //if ((otkey == null) || (opkey == null)) continue; if (opkey == null) { continue; } var idfsParameter = Convert.ToInt64(opkey); var ap = activityParameters.FirstOrDefault(a => a.idfsParameter == idfsParameter); if ((ap != null) && !ap.IsMarkedToDelete) { object value; if (ap.strNameValue.Length > 0) { value = ap.strNameValue; } else { value = ap.varValue ?? String.Empty; int i; if (Int32.TryParse(value.ToString(), out i)) { value = i; if (i == 0) { value = String.Empty; } } } var strValue = value.ToString(); if (strValue.Length > 0) { //уточняем формат выводимых дат if (column.ExtendedProperties.Contains(parameterTemplateKey)) { var pt = column.ExtendedProperties[parameterTemplateKey] as ParameterTemplate; if ((pt != null) && pt.IsParameterDate()) { var sp = strValue.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries); if (sp.Length > 0) { strValue = sp[0]; } } } row[GetColumnName(idfsParameter)] = strValue; } } } } //сортируем, упорядочивая по номерам строк. Это актуально для динамических таблиц. if (!section.IsFixedStubSection) { rowList.Sort(new ActivityParametersRowsComparer()); } foreach (var dataRow in rowList) { resultTable.Rows.Add(dataRow); } } return(resultTable); }