/// <summary> /// Transforma os dados em uma tabela (DataTable) /// </summary> /// <param name="tp">Tipo de dados a ser obtido (filtrado)</param> /// <returns>DataBable co mos dados de um determinado tipo</returns> public DataTable Table(Type tp) { LayoutType lt = type.Find(t => t.type == tp); if (lt.type == null) { throw new Exception("Tipo não existe no layout: " + tp.FullName); } DataTable tb = new DataTable(tp.Name); RegFormat rf; foreach (FieldInfo fi in lt.type.GetFields()) { if (!fi.IsSpecialName) { rf = (RegFormat)Attribute.GetCustomAttribute(fi, typeof(RegFormat)); switch (rf._type) { case RegType.P9: //Para evitar qualquer problema de conversão //if (rf._length < 10) // tb.Columns.Add(fi.Name, typeof(int)); //else tb.Columns.Add(fi.Name, typeof(string)); break; case RegType.PD: tb.Columns.Add(fi.Name, typeof(DateTime)); break; default: tb.Columns.Add(fi.Name, typeof(string)); break; } } } IReg reg; // int n = 0; foreach (object obj in itens) { if (obj.GetType().GetInterface("IReg") != null) { reg = (IReg)obj; if (reg.NameType == tp) { tb.Rows.Add(reg.Values); //if (++n % 100 == 0) // Thread.CurrentThread.MonitorStatus(100,"Layout {0}: {1}/{2}", reg.NameType, n, itens.Count); } } } return(tb); }
/// <summary> /// Define um modelo de layout /// </summary> /// <param name="eTypes">Tipos de enumeradores de estruturra</param> public Layout(params Type[] eTypes) { Data = new SortedList <string, object>(); type = new List <LayoutType>(); itens = new List <IReg>(); AddTypes(eTypes); if (type.Count > 0) { LastRegType = type[0]; } }
/// <summary> /// Achar o tipo de registro de acordo com o tipo de linha /// </summary> protected bool FindReg(ref IReg reg, string cLine) { if (reg == null || !LastRegType.layout.IsThis(cLine)) { foreach (LayoutType lt in type) { if (lt.layout.IsThis(cLine)) { // Define o ultimo tipo, como o atual encontrado LastRegType = lt; reg = (IReg)Activator.CreateInstance(LastRegType.reg); return(true); } } // Não Achou return(false); } reg = reg.Copy(); // É igual ao ultimo tipo (LastRegType) return(true); }