//------------------------------------------------------------------------------------- /// <summary> /// Инициализирующий конструктор. /// </summary> public SimDataGridViewFindForm(SimDataGridView finistDataGridView, string prevFind) : this() { view = finistDataGridView; timer.Tick += new EventHandler(timer_Tick); textBoxText.Text = prevFind; }
//------------------------------------------------------------------------------------- #region << Overrides Methods >> /// <summary> /// Initialize /// </summary> /// <param name="component"></param> public override void Initialize(IComponent component) { base.Initialize(component); //base.AutoResizeHandles = true; this.ex = component as SimDataGridViewEx; this.grid = this.ex.Grid; base.EnableDesignMode(this.ex.Grid, "Grid"); this.designerHost = (IDesignerHost)component.Site.GetService(typeof(IDesignerHost)); }
//------------------------------------------------------------------------------------- /// <summary> /// ћетод экспорта данных в файл Excel. /// </summary> /// <param name="table">“аблица, содержаща¤ экспортируемые данные.</param> /// <param name="xlsFile">‘айл xls, в который экспортируютс¤ данные.</param> public static void ExportToExcel(SimDataGridView table, string xlsFile) { FileStream fss = null; IStorage stg = null; IStream3 stream = null; uint len = 0; byte[] arr = null; LittleEndianWord w = new LittleEndianWord(); //Dictionary<string, uint> strTable = new Dictionary<string,uint>(); //uint strCount = 0; try { if(table.Rows.Count > ushort.MaxValue - 1) throw new Exception(String.Format(" оличество строк должно быть меньше {0}!", ushort.MaxValue - 1)); #region —оздаем пустой xls файл. FileStream file = File.Create(xlsFile); byte[] tes = (byte[])global::Sim.Controls.Properties.Resources.Excel; file.Write(tes, 0, tes.Length); file.Flush(); file.Close(); #endregion —оздаем пустой xls файл. #region ќткрываем хранилище дл¤ чтени¤ и временный файл дл¤ записи uint hr = StgOpenStorageEx(xlsFile, (uint)( StorageModes.STGM_DIRECT | StorageModes.STGM_READWRITE | StorageModes.STGM_SHARE_EXCLUSIVE), 0, 0, (IntPtr)0, (IntPtr)0, ref StructuredStorageGuid, ref stg); if(hr > 0) throw new Exception("ќшибка при открытии xls файла дл¤ чтени¤!"); hr = stg.OpenStream("Workbook", 0, (uint)( StorageModes.STGM_READ | StorageModes.STGM_DIRECT | StorageModes.STGM_SHARE_EXCLUSIVE), 0, out stream); if(hr > 0) throw new Exception("ќшибка при открытии Workbook потока временного xls файла!"); fss = new FileStream(Environment.GetEnvironmentVariable("TEMP") + "\\excel_export.fe", FileMode.Create); #endregion ќткрываем хранилище дл¤ чтени¤ и временный файл дл¤ записи #region „итаем и записываем до данных while(true) { if((hr = stream.Read(w, 2, out len)) != 0 || len == 0) break; if(w == 0x0200) { if((hr = stream.Read(w, 2, out len)) != 0 || len == 0) throw new Exception(String.Format("ќшибка в записи, hr = {0}, len = {1}!", hr.ToString("X"), len)); arr = new byte[w]; if((hr = stream.Read(arr, w, out len)) != 0 || len == 0) throw new Exception(String.Format("ќшибка в записи, hr = {0}, len = {1}!", hr.ToString("X"), len)); break; } fss.Write(w, 0, 2); if((hr = stream.Read(w, 2, out len)) != 0 || len == 0) throw new Exception(String.Format("ќшибка в записи, hr = {0}, len = {1}!", hr.ToString("X"), len)); fss.Write(w, 0, 2); if(w > 0) { arr = new byte[w]; if((hr = stream.Read(arr, w, out len)) != 0 || len == 0) throw new Exception(String.Format("ќшибка в записи, hr = {0}, len = {1}!", hr.ToString("X"), len)); fss.Write(arr, 0, w); } } #endregion „итаем и записываем до данных #region «аписываем данные arr = Build_DIMENSIONS_Record(table.Rows.Count, table.Columns.Count); fss.Write(arr, 0, arr.Length); uint offsetFirstRow = 0; ushort rowset = 0; ushort row = 0; ushort[] cellBlocksOffsets = null; while(row < table.Rows.Count + 1) { if((table.Rows.Count + 1 - row) >= 32) rowset = 32; else rowset = (ushort)(table.Rows.Count + 1 - row); cellBlocksOffsets = new ushort[rowset]; for(ushort a = 0; a < rowset; a++) { arr = Build_ROW_Record((ushort)(row + a), (ushort)table.Columns.Count); fss.Write(arr, 0, arr.Length); offsetFirstRow += (uint)arr.Length; if(a != 0) cellBlocksOffsets[0] += (ushort)arr.Length; } for(int a = 0; a < rowset; row++, a++) { for(ushort col = 0; col < table.Columns.Count; col++) { if(row == 0) arr = Build_LABEL_Record(row, col, table.Columns[col].HeaderText); else { object obj = table[col, row - 1].Value; if(obj == null) obj = table[col, row - 1].FormattedValue; if(Convert.IsDBNull(obj)) continue; switch((table.Columns[col].ValueType ?? typeof(string)).Name) { case "Byte": arr = Build_RK_Record(row, col, (Int32)(Byte)obj); break; case "SByte": arr = Build_RK_Record(row, col, (Int32)(SByte)obj); break; case "Int16": arr = Build_RK_Record(row, col, (Int32)(Int16)obj); break; case "UInt16": arr = Build_RK_Record(row, col, (Int32)(UInt16)obj); break; case "Int32": if((arr = Build_RK_Record(row, col, (Int32)obj)) == null) arr = Build_NUMBER_Record(row, col, (Double)(Int32)obj); break; case "UInt32": if((UInt32)obj <= 0x1FFFFFFF) arr = Build_RK_Record(row, col, (Int32)(UInt32)obj); else arr = Build_NUMBER_Record(row, col, (Double)(UInt32)obj); break; case "Int64": arr = Build_NUMBER_Record(row, col, (Double)(Int64)obj); break; case "UInt64": arr = Build_NUMBER_Record(row, col, (Double)(UInt64)obj); break; case "Decimal": //double val = (Double)(Decimal)obj;//Double.Parse(((Decimal)obj).ToString()); if((arr = Build_RK_Record(row, col, (Double)(Decimal)obj)) == null) arr = Build_NUMBER_Record(row, col, (Double)(Decimal)obj); break; case "Single": double val = Double.Parse(((Single)obj).ToString()); if((arr = Build_RK_Record(row, col, val)) == null) arr = Build_NUMBER_Record(row, col, val); break; case "Double": if((arr = Build_RK_Record(row, col, (Double)obj)) == null) arr = Build_NUMBER_Record(row, col, (Double)obj); break; //case "Boolean": arr = Build_BOOLERR_Record(row, col, (Boolean)obj); case "Boolean": arr = Build_LABEL_Record(row, col, obj == null ? "" : ((bool)obj ? "+" : "-")); break; case "String": arr = Build_LABEL_Record(row, col, obj == null ? "" : obj.ToString()); break; case "DateTime": arr = Build_NUMBER_Record(row, col, (DateTime)obj); break; //default: throw new Exception(String.Format("“ип данных {0} не поддерживаетс¤ дл¤ экспорта!", // table.Columns[col].ValueType.FullName)); default: arr = Build_LABEL_Record(row, col, obj == null ? "" : obj.ToString()); break; } } fss.Write(arr, 0, arr.Length); offsetFirstRow += (uint)arr.Length; if(a != 0) { if((cellBlocksOffsets[a] + arr.Length) <= ushort.MaxValue) cellBlocksOffsets[a] += (ushort)arr.Length; else cellBlocksOffsets[a] = 0; } } } arr = Build_DBCELL_Record(offsetFirstRow, cellBlocksOffsets); fss.Write(arr, 0, arr.Length); offsetFirstRow = 0; } #endregion «аписываем данные #region ƒописываем оставшиес¤ данные из потока while(true) { if((hr = stream.Read(w, 2, out len)) != 0 || len == 0) break; if(w == 0x000A) { fss.Write(w, 0, 2); if((hr = stream.Read(w, 2, out len)) != 0 || len == 0) throw new Exception(String.Format("ќшибка в записи, hr = {0}, len = {1}!", hr.ToString("X"), len)); fss.Write(w, 0, 2); break; } fss.Write(w, 0, 2); if((hr = stream.Read(w, 2, out len)) != 0 || len == 0) throw new Exception(String.Format("ќшибка в записи, hr = {0}, len = {1}!", hr.ToString("X"), len)); fss.Write(w, 0, 2); if(w > 0) { arr = new byte[w]; if((hr = stream.Read(arr, w, out len)) != 0 || len == 0) throw new Exception(String.Format("ќшибка в записи, hr = {0}, len = {1}!", hr.ToString("X"), len)); fss.Write(arr, 0, w); } } fss.Close(); Marshal.ReleaseComObject(stream); stream = null; #endregion ƒописываем оставшиес¤ данные из потока #region «аписываем данные из временного файла fss = new FileStream(Environment.GetEnvironmentVariable("TEMP") + "\\excel_export.fe", FileMode.Open, FileAccess.Read); stg.CreateStream("Workbook", (uint)( StorageModes.STGM_WRITE | StorageModes.STGM_DIRECT | StorageModes.STGM_SHARE_EXCLUSIVE | StorageModes.STGM_CREATE), 0, 0, out stream); hr = stream.SetSize((ulong)fss.Length); arr = new byte[32768]; while(fss.Read(arr, 0, 32768) != 0) if((hr = stream.Write(arr, 32768, out len)) != 0 || len == 0) throw new Exception(String.Format("ќшибка при записи в выходной поток, hr = {0}, len = {1}!", hr.ToString("X"), len)); #endregion «аписываем данные из временного файла } catch(Exception Err) { ErrorBox.Show(Err); } finally { if(fss != null) fss.Close(); if(stream != null) Marshal.ReleaseComObject(stream); if(stg != null) Marshal.ReleaseComObject(stg); if(File.Exists(Environment.GetEnvironmentVariable("TEMP") + "\\excel_export.fe")) File.Delete(Environment.GetEnvironmentVariable("TEMP") + "\\excel_export.fe"); } }
//------------------------------------------------------------------------------------- /// <summary> /// ћетод экспорта данных в файл CSV. /// </summary> /// <param name="view">“аблица, содержаща¤ экспортируемые данные.</param> /// <param name="csvFile">‘айл csv, в который экспортируютс¤ данные.</param> public static void ExportToCsv(SimDataGridView view, string csvFile) { StreamWriter file = null; try { file = new StreamWriter(csvFile, false, Encoding.Default); StringBuilder sb = new StringBuilder(1000); foreach(DataGridViewColumn col in view.Columns) sb.AppendFormat("\"{0}\";", col.HeaderText.Replace("\"", "\"\"")); file.WriteLine(sb.ToString()); foreach(DataGridViewRow row in view.Rows) { StringBuilder cmdtext = new StringBuilder(1000); for(int col = 0; col < view.ColumnCount; col++) //DataGridViewColumn col in view.Columns) { if(row.Cells[col].ValueType == typeof(string)) cmdtext.AppendFormat("\"{0}\";", row.Cells[col].Value.ToString().Replace("\"", "\"\"")); else cmdtext.AppendFormat("{0};", row.Cells[col].Value ?? row.Cells[col].FormattedValue); } file.WriteLine(cmdtext.ToString()); } } catch(Exception Err) { ErrorBox.Show(Err); } finally { if(file != null) file.Close(); } }
//------------------------------------------------------------------------------------- #region << Methods >> private void Fill() { try { this.Controls.Clear(); if(obj == null) return; this.SuspendLayout(); //List<Tuple<PropertyDescriptor,int?>> list = new List<Tuple<PropertyDescriptor, int?>>(); //foreach(PropertyDescriptor pd in TypeDescriptor.GetProperties(obj)) // if(((showID && pd.Name == "OID") || pd.IsBrowsable) && // (typeFilter == null || typeFilter.Contains(pd.ComponentType))) // { // DisplayOrderAttribute attr = pd.Attributes.OfType<DisplayOrderAttribute>().FirstOrDefault(); // list.Add(new Tuple<PropertyDescriptor, int?>(pd, attr == null ? null : (int?)attr.Order)); // } //list.Sort(Sorter); if(IsTableView) { SimDataGridView grid = new SimDataGridView(); List<ValuesPair<string, string>> viewList = new List<ValuesPair<string, string>>(); foreach(PropertyDescriptor i in TypeDescriptor.GetProperties(obj)) { if(!((showID && i.Name == "OID") || i.IsBrowsable)) continue; if(typeFilter != null && typeFilter.Contains(i.ComponentType) == false) continue; ValuesPair<string, string> item = new ValuesPair<string, string>(); item.Value1 = i.DisplayName; object val = i.GetValue(obj) ?? "(пусто)"; if(val is DateTime) { DateTime d = (DateTime)val; if(d.TimeOfDay.Ticks == 0) item.Value2 = d.ToShortDateString(); else item.Value2 = val.ToString(); } else if(val is IList) { StringBuilder sb = new StringBuilder(); for(int a = 0; a < ((IList)val).Count; a++) { sb.AppendFormat("{0}", i.Converter is ReferenceConverter ? (((IList)val)[a] ?? "").ToString() : i.Converter.ConvertToString(((IList)val)[a])); if(!(((IList)val).Count < 2 || a == ((IList)val).Count -1)) sb.AppendLine(""); } if(sb.Length == 0) item.Value2 = "(пусто)"; else item.Value2 = sb.ToString(); } else if(i.Converter is ReferenceConverter) item.Value2 = (val ?? "").ToString(); else item.Value2 = i.Converter.ConvertToString(val); viewList.Add(item); } grid.RowHeadersVisible = false; grid.BorderStyle = System.Windows.Forms.BorderStyle.None; grid.CellBorderStyle = DataGridViewCellBorderStyle.None; grid.RowTemplate.Height = 16; grid.ColumnHeadersVisible = false; grid.DefaultCellStyle.SelectionForeColor = grid.DefaultCellStyle.ForeColor; grid.Dock = DockStyle.Fill; grid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; grid.BackgroundColor = this.BackColor; grid.DefaultCellStyle.BackColor = this.BackColor; grid.DefaultCellStyle.SelectionBackColor = this.BackColor; grid.CellPainting += new DataGridViewCellPaintingEventHandler(grid_CellPainting); grid.DataSource = new ListBinder(viewList); grid.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader; this.Controls.Add(grid); } else { SimLayoutPanel p = new SimLayoutPanel() { AutoSizeMode = AutoSizeMode.GrowAndShrink, AutoSize = true }; foreach(PropertyDescriptor i in TypeDescriptor.GetProperties(obj)) { if(!((showID && i.Name == "OID") || i.IsBrowsable)) continue; if(typeFilter != null && typeFilter.Contains(i.ComponentType) == false) continue; SimTwoLabel l = new SimTwoLabel(); l.Label1Text = i.DisplayName + ":"; l.Label1Image = global::Sim.Common.Properties.Resources.Point_x6; l.Label1Font = new Font(this.Font, FontStyle.Bold); l.Label1ForeColor = SystemColors.ControlDark; object val = i.GetValue(obj) ?? "(пусто)"; if(val is DateTime) l.Label2Text = ((DateTime)val).TimeOfDay.Ticks == 0 ? ((DateTime)val).ToShortDateString() : val.ToString(); else l.Label2Text = TypeDescriptor.GetConverter(val).ConvertToString(val); l.Margin = new Padding(0, 0, 6, 4); p.Controls.Add(l); } //p.BackColor = Color.Red; p.Dock = DockStyle.Top; this.Controls.Add(p); } } catch(Exception Err) { Sim.Controls.ModalErrorBox.Show(Err, this.FindModalContainer()); } finally { this.PerformLayout(); this.ResumeLayout(); } }