using HotelPms.Share.IO; using HotelPms.Share.Util; using HotelPms.Share.Windows.Report.Member; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.IO; using System.Windows.Forms; namespace HotelPms.Share.Windows.Report { public class GridReport : PrintGdiPlus, IDisposable, IReport { #region ★★★★★ Declartions ★★★★★ private bool m_Disposed = false; private bool m_InitOK = false; private float m_CurrentY = 0F; #endregion #region ★★★★★ Property ★★★★★ #endregion #region ★★★★★ Class Event ★★★★★ public GridReport(DataTable data, GridStyle style, string pdfFile) { m_Data = data; m_Style = style; if (m_PrintDoc.DefaultPageSettings.PaperSize.Width < m_PrintDoc.DefaultPageSettings.PaperSize.Height) { m_PrintDoc.DefaultPageSettings.Landscape = true; } //PDFの場合 if (pdfFile.Length > 0) { PrintDoc.PrinterSettings.PrinterName = "Microsoft Print to PDF"; PrintDoc.PrinterSettings.PrintFileName = pdfFile; PrintDoc.PrinterSettings.PrintToFile = true; } this.PrintDoc.PrintPage += PrintDoc_PrintPage; m_InitOK = false; } ~GridReport() { Dispose(false); } protected override void Dispose(bool disposing) { if (!m_Disposed) //一回だけ { if (disposing) { //Managed Resources } //Unmanaged resources m_Disposed = true; } base.Dispose(disposing); } public override void Dispose() { Dispose(true); GC.SuppressFinalize(this); } #endregion #region ★★★★★ Control Event ★★★★★ private void PrintDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { //初期化 Init(e); //ヘッダー出力 PrintHeader(e); //明細出力 PrintDetail(e); //フッター出力 PrintFooter(e); //次のページ e.HasMorePages = m_DataRowIndex < (m_Data.Rows.Count - 1); m_PageIndex++; } #endregion #region ★★★★★ Private Function ★★★★★ private void Init(System.Drawing.Printing.PrintPageEventArgs e) { try { if (m_InitOK) { return; } //if (GeneralSub.IsIdeMode()) //{ // using (Pen pen = new Pen(Color.Blue, 4F)) // { // e.Graphics.DrawRectangle(pen, new Rectangle(e.PageBounds.X, e.PageBounds.Y, e.PageBounds.Width - (int)e.PageSettings.HardMarginX * 2 - (int)pen.Width, e.PageBounds.Height - (int)e.PageSettings.HardMarginY * 2 - (int)pen.Width)); // } //} //印字範囲 98% float width = e.PageBounds.Width - (int)e.PageSettings.HardMarginX * 2; float height = e.PageBounds.Height - (int)e.PageSettings.HardMarginY * 2; m_PrintWidth = width * PaperSizeRate; m_PrintHeight = height * PaperSizeRate; m_LeftMargins = (width * 1.0F - m_PrintWidth) / 2; m_TopMargins = (height * 1.0F - m_PrintHeight) / 2; //if (GeneralSub.IsIdeMode()) { e.Graphics.DrawRectangle(Pens.Red, m_LeftMargins, m_TopMargins, m_PrintWidth, m_PrintHeight); } //各列のX位置の計算 float x = m_LeftMargins; foreach (ColumnStyle item in m_Style.ColumnStyle) { item.Width = item.WidthRate * m_PrintWidth; item.Left = x; x += item.Width; } //ヘッダー情報位置の計算 BuildHeader(e.Graphics); m_DetailRowHeight = GetTextHeight(e.Graphics, m_Style.Font) + (float)m_Style.DefaultRowStyle.Padding.Top + (float)m_Style.DefaultRowStyle.Padding.Bottom; //行高さ m_HeaderHeight = m_Style.Header.Height; //ヘッダーの高さ m_CaptionHeight = GetTextHeight(e.Graphics, m_Style.ColumnStyle[0].Font) + (float)m_Style.DefaultRowStyle.Padding.Top + (float)m_Style.DefaultRowStyle.Padding.Bottom; //項目名印字行の高さ m_FooterHeight = 0F; //フッターの高さ(TODO) float detailHeight = m_PrintHeight - m_HeaderHeight - m_CaptionHeight - m_FooterHeight; //明細印字領域の高さ //行数 m_DetailRowCount = (int)(detailHeight / m_DetailRowHeight); //ページ数 m_PageIndex = 1; m_PageCount = m_Data.Rows.Count / m_DetailRowCount + (((m_Data.Rows.Count % m_DetailRowCount) > 0) ? 1 : 0); m_InitOK = true; } catch(Exception ex) { OperationLog.Instance.WriteLog($"GridReport.Init:{ex.Message}"); } } private float GetPrintRowHeight(Graphics g, PrintRow row) { float height = 0; foreach (Cell cell in row.Cells) { if (cell.Style == null) { cell.Style = m_Style.Header.DefaultCellStyle; } cell.Style.Height = GetTextHeight(g, cell.Style.Font) + cell.Style.Padding.Top + cell.Style.Padding.Bottom; if (height < cell.Style.Height) { height = cell.Style.Height; } } return height; } /// /// 印字位置の計算 /// (X,Y,Width,Height) /// private void BuildHeader(Graphics g) { float y = m_TopMargins; foreach(PrintRow row in Style.Header.Rows) { #region 行毎 float x = m_LeftMargins; float width = m_PrintWidth; float height = GetPrintRowHeight(g, row); foreach(Cell cell in row.Cells) { #region 列毎 //Y位置 cell.Style.Top = y; //文言予測 if (cell.CellType == Cell.CellKind.PrintTime) { cell.Text = cell.Style.Template.Length > 0 ? string.Format(cell.Style.Template, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")) : DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); } else if (cell.CellType == Cell.CellKind.PageNo) { cell.Text = cell.Style.Template.Length > 0 ? string.Format(cell.Style.Template, m_PageIndex, m_PageCount) : $"99999 / 99999"; } else if (cell.CellType == Cell.CellKind.TimeAndPage) { cell.Text = cell.Style.Template.Length > 0 ? string.Format(cell.Style.Template, DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), m_PageIndex, m_PageCount) : $"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")} {m_PageIndex} / {m_PageCount.ToString().PadLeft(5, ' ')}"; } else { cell.Text = cell.Style.Template.Length > 0 ? string.Format(cell.Style.Template, cell.Text) : cell.Text; } //X位置 if (cell.Style.LocalXMode == CellStyle.ELocalXMode.BeginOfCol) { x = Style.ColumnStyle[cell.Style.BeginCol].Left; cell.Style.Left = x; } //幅 if (cell.Style.WidthMode == CellStyle.EWidthMode.TextWidth) { cell.Style.Width = GetTextWidth(g, cell.Style.Font, cell.Text) + cell.Style.Padding.Left + cell.Style.Padding.Right; } else if (cell.Style.WidthMode == CellStyle.EWidthMode.AutoFill) { cell.Style.Width = width; } else if (cell.Style.WidthMode == CellStyle.EWidthMode.EndOfCol) { cell.Style.Width = Style.ColumnStyle[cell.Style.EndCol].Left + Style.ColumnStyle[cell.Style.EndCol].Width - Style.ColumnStyle[cell.Style.BeginCol].Left; } //高さ(最大) cell.Style.Height = height; //X位置 if (cell.Style.LocalXMode == CellStyle.ELocalXMode.BeginOfCol) { x += cell.Style.Width; } else { if (cell.Style.Dock == DockStyle.Left || cell.Style.Dock == DockStyle.Fill) { cell.Style.Left = x; x += cell.Style.Width; } else if (cell.Style.Dock == DockStyle.Right) { cell.Style.Left = m_LeftMargins + width - cell.Style.Width; } else if (cell.Style.Dock == DockStyle.Fill) { cell.Style.Left = x; } else { //Noneで、実際の位置設定 } } //幅の変化 width -= cell.Style.Width; #endregion } y += height; #endregion } } private void PrintHeader(System.Drawing.Printing.PrintPageEventArgs e) { m_CurrentY = m_TopMargins; //複数行想定(タイトル+印字時間+ページなど) foreach (PrintRow row in m_Style.Header.Rows) { foreach (Cell cell in row.Cells) { DrawCell(e.Graphics, cell); } } //列名 m_CurrentY = m_TopMargins + m_HeaderHeight; foreach (ColumnStyle cs in m_Style.ColumnStyle) { Cell item = new Cell(); item.Style = m_Style.DefaultCellStyle.Clone() as CellStyle; item.Style.Font = cs.Font; item.Style.RectangleF = new RectangleF(new PointF(cs.Left, m_CurrentY), new SizeF(cs.Width, m_CaptionHeight)); item.Text = cs.Text; item.Style.LeftBorder.Visible = true; item.Style.TopBorder.Visible = true; item.Style.RightBorder.Visible = true; item.Style.BottomBorder.Visible = true; item.Style.Alignment = cs.Alignment; item.Style.LineAlignment = cs.LineAlignment; DrawCell(e.Graphics, item); } m_CurrentY = m_TopMargins + m_HeaderHeight + m_CaptionHeight; } private void PrintFooter(System.Drawing.Printing.PrintPageEventArgs e) { } private void PrintDetail(System.Drawing.Printing.PrintPageEventArgs e) { for (int i = 0; i < m_DetailRowCount; i++) { if (m_DataRowIndex == m_Data.Rows.Count) { break; } DataRow row = m_Data.Rows[m_DataRowIndex]; //行印字 foreach (ColumnStyle cs in m_Style.ColumnStyle) { Cell item = new Cell(); item.Style = m_Style.DefaultCellStyle.Clone() as CellStyle; item.Style.RectangleF = new RectangleF(new PointF(cs.Left, m_CurrentY), new SizeF(cs.Width, m_DetailRowHeight)); item.Text = row[cs.DataField].ToString(); item.Style.LeftBorder.Visible = true; item.Style.TopBorder.Visible = true; item.Style.RightBorder.Visible = true; item.Style.BottomBorder.Visible = true; if (cs.DefaultCellStyle != null) { item.Style.Alignment = cs.DefaultCellStyle.Alignment; item.Style.LineAlignment = cs.DefaultCellStyle.LineAlignment; } DrawCell(e.Graphics, item); } m_CurrentY += m_DetailRowHeight; m_DataRowIndex++; } } #endregion #region ★★★★★ Public Function ★★★★★ #endregion } }