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