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
|
}
|
}
|