From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。
---
HotelPms.Share.Windows/Report/GridReport.cs | 347 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 347 insertions(+), 0 deletions(-)
diff --git a/HotelPms.Share.Windows/Report/GridReport.cs b/HotelPms.Share.Windows/Report/GridReport.cs
new file mode 100644
index 0000000..eaf01c7
--- /dev/null
+++ b/HotelPms.Share.Windows/Report/GridReport.cs
@@ -0,0 +1,347 @@
+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;
+ }
+
+ /// <summary>
+ /// 印字位置の計算
+ /// (X,Y,Width,Height)
+ /// </summary>
+ 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
+ }
+}
--
Gitblit v1.10.0