using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
public partial class FrmPrint : Form
{
private System.Drawing.Printing.PaperSize paperSize;
/// <summary>
/// 打印的标题
/// </summary>
public string strTitle { get; set; }
/// <summary>
/// 打印显示的内容
/// </summary>
public DataTable printDt = new DataTable();
/// <summary>
/// 表格宽度
/// </summary>
public int PRINT_GRID_WIDTH = 400;
/// <summary>
/// 表格左边界(或右)
/// </summary>
public int PRINT_GRID_LEFT = 150;
/// <summary>
/// 表格距页面顶端的距离
/// </summary>
public int TABLE_TOP_HEIGHT = 200;
/// <summary>
/// 打印内容距离表格顶端的距离
/// </summary>
private const int PRINT_TOP_HEIGHT = 20;
/// <summary>
/// 单元格高度
/// </summary>
private const int PRINT_CELL_HEIGHT = 50;
/// <summary>
/// 打印字体
/// </summary>
private Font printFont;
/// <summary>
/// 打印字体(表头)
/// </summary>
private Font printFontTitle;
/// <summary>
/// 打印画笔
/// </summary>
{
InitializeComponent();
}
private void FrmPrint_Load(object sender, EventArgs e)
{
try
{
this.printPreview.Document = this.printDoc;
paperSize = printDoc.PrinterSettings.DefaultPageSettings.PaperSize;
printFontTitle = new Font(this.Font.FontFamily, 16, FontStyle.Bold);
printFont = new Font(this.Font.FontFamily, 16);
LoadData();
//将标题加载至datatable的第一行中
DataRow drTitle = printDt.NewRow();
drTitle[0] = strTitle;
printDt.Rows.InsertAt(drTitle, 0);
}
catch (Exception ex)
{
MessageBox.Show(this, "加载窗体时出错,详细信息:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadData()
{
printDt.Columns.Add("c1");
printDt.Columns.Add("c2");
printDt.Columns.Add("c3");
printDt.Columns.Add("c4");
for (int i = 0; i < 10; i++)
{
DataRow dr = printDt.NewRow();
dr["c1"] = "c1"+i.ToString();
dr["c2"] = "c2" + i.ToString();
dr["c3"] = "c3" + i.ToString();
dr["c4"] = "c4" + i.ToString();
printDt.Rows.Add(dr);
}
}
private void printDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
try
{
if (this.DesignMode) return;
if (printDt.Rows.Count <= 1)
{
MessageBox.Show(this, "没有要打印的内容。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
SizeF fontSize = e.Graphics.MeasureString(this.strTitle, printFont);
float printMiddle = (paperSize.Width - fontSize.Width) / 2.0f;//页面中心
Pen p = new Pen(Color.Black, 1);
//根据printDt的行数,算出每一行上单元格的宽度
float oneCellWidth = (paperSize.Width - (printMiddle - PRINT_GRID_LEFT) * 2) / printDt.Columns.Count;
for (int i = 1; i <= printDt.Rows.Count; i++)
{
float y =this.TABLE_TOP_HEIGHT+(i-1) * PRINT_CELL_HEIGHT;//y轴坐标
e.Graphics.DrawRectangle(p, printMiddle - PRINT_GRID_LEFT, y, PRINT_GRID_WIDTH, PRINT_CELL_HEIGHT);
if (i != 1)
{
bool lastNull=false;//上一列是否为空
int startDrawIndex=0;//当前列不为空时,要打印数据的位置
//画出每一行中每一单元格的竖线
for (int j = 1; j <= printDt.Columns.Count; j++)
{
if (printDt.Rows[i - 1][j - 1] != DBNull.Value)
{
if(j<printDt.Columns.Count)//此处画出竖线,因之前画过一矩形,此处不再画最后一条竖线
e.Graphics.DrawLine(p, printMiddle - PRINT_GRID_LEFT + j * oneCellWidth, y, printMiddle - PRINT_GRID_LEFT + j * oneCellWidth, y + PRINT_CELL_HEIGHT);//画出单元格
if (!lastNull)
{
startDrawIndex = j;
}
e.Graphics.DrawString(string.Format("{0}", printDt.Rows[i - 1][j - 1].ToString()), printFont, printSolidBrush, printMiddle - PRINT_GRID_LEFT + (startDrawIndex - 1) * oneCellWidth, y + PRINT_TOP_HEIGHT);
lastNull = false;//打印过值后,此时对于下一列来说,他的上一列已不为空,所以置该标示
}
else
{
//说明该列之前那一列不为空
if (!lastNull)
{
startDrawIndex = j;
lastNull = true;
}
}
}
}
else
{
//打印标题
e.Graphics.DrawString(string.Format("{0}", this.printDt.Rows[0][0].ToString()), printFontTitle, printSolidBrush, printMiddle, y + PRINT_TOP_HEIGHT);
}
}
}
catch (Exception ex)
{
MessageBox.Show("打印预览过程中出错,详细:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tBtnPrint_Click(object sender, EventArgs e)
{
printDoc.Print();
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WinFormPrint
{public partial class FrmPrint : Form
{
private System.Drawing.Printing.PaperSize paperSize;
/// <summary>
/// 打印的标题
/// </summary>
public string strTitle { get; set; }
/// <summary>
/// 打印显示的内容
/// </summary>
public DataTable printDt = new DataTable();
/// <summary>
/// 表格宽度
/// </summary>
public int PRINT_GRID_WIDTH = 400;
/// <summary>
/// 表格左边界(或右)
/// </summary>
public int PRINT_GRID_LEFT = 150;
/// <summary>
/// 表格距页面顶端的距离
/// </summary>
public int TABLE_TOP_HEIGHT = 200;
/// <summary>
/// 打印内容距离表格顶端的距离
/// </summary>
private const int PRINT_TOP_HEIGHT = 20;
/// <summary>
/// 单元格高度
/// </summary>
private const int PRINT_CELL_HEIGHT = 50;
/// <summary>
/// 打印字体
/// </summary>
private Font printFont;
/// <summary>
/// 打印字体(表头)
/// </summary>
private Font printFontTitle;
/// <summary>
/// 打印画笔
/// </summary>
private SolidBrush printSolidBrush;
public FrmPrint(){
InitializeComponent();
}
private void FrmPrint_Load(object sender, EventArgs e)
{
try
{
this.printPreview.Document = this.printDoc;
paperSize = printDoc.PrinterSettings.DefaultPageSettings.PaperSize;
printFontTitle = new Font(this.Font.FontFamily, 16, FontStyle.Bold);
printFont = new Font(this.Font.FontFamily, 16);
printSolidBrush = new SolidBrush(Color.Black);
this.strTitle = "标题测试";LoadData();
//将标题加载至datatable的第一行中
DataRow drTitle = printDt.NewRow();
drTitle[0] = strTitle;
printDt.Rows.InsertAt(drTitle, 0);
}
catch (Exception ex)
{
MessageBox.Show(this, "加载窗体时出错,详细信息:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadData()
{
printDt.Columns.Add("c1");
printDt.Columns.Add("c2");
printDt.Columns.Add("c3");
printDt.Columns.Add("c4");
for (int i = 0; i < 10; i++)
{
DataRow dr = printDt.NewRow();
dr["c1"] = "c1"+i.ToString();
dr["c2"] = "c2" + i.ToString();
dr["c3"] = "c3" + i.ToString();
dr["c4"] = "c4" + i.ToString();
printDt.Rows.Add(dr);
}
}
private void printDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
try
{
if (this.DesignMode) return;
if (printDt.Rows.Count <= 1)
{
MessageBox.Show(this, "没有要打印的内容。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
SizeF fontSize = e.Graphics.MeasureString(this.strTitle, printFont);
float printMiddle = (paperSize.Width - fontSize.Width) / 2.0f;//页面中心
Pen p = new Pen(Color.Black, 1);
//根据printDt的行数,算出每一行上单元格的宽度
float oneCellWidth = (paperSize.Width - (printMiddle - PRINT_GRID_LEFT) * 2) / printDt.Columns.Count;
for (int i = 1; i <= printDt.Rows.Count; i++)
{
float y =this.TABLE_TOP_HEIGHT+(i-1) * PRINT_CELL_HEIGHT;//y轴坐标
e.Graphics.DrawRectangle(p, printMiddle - PRINT_GRID_LEFT, y, PRINT_GRID_WIDTH, PRINT_CELL_HEIGHT);
if (i != 1)
{
bool lastNull=false;//上一列是否为空
int startDrawIndex=0;//当前列不为空时,要打印数据的位置
//画出每一行中每一单元格的竖线
for (int j = 1; j <= printDt.Columns.Count; j++)
{
if (printDt.Rows[i - 1][j - 1] != DBNull.Value)
{
if(j<printDt.Columns.Count)//此处画出竖线,因之前画过一矩形,此处不再画最后一条竖线
e.Graphics.DrawLine(p, printMiddle - PRINT_GRID_LEFT + j * oneCellWidth, y, printMiddle - PRINT_GRID_LEFT + j * oneCellWidth, y + PRINT_CELL_HEIGHT);//画出单元格
if (!lastNull)
{
startDrawIndex = j;
}
e.Graphics.DrawString(string.Format("{0}", printDt.Rows[i - 1][j - 1].ToString()), printFont, printSolidBrush, printMiddle - PRINT_GRID_LEFT + (startDrawIndex - 1) * oneCellWidth, y + PRINT_TOP_HEIGHT);
lastNull = false;//打印过值后,此时对于下一列来说,他的上一列已不为空,所以置该标示
}
else
{
//说明该列之前那一列不为空
if (!lastNull)
{
startDrawIndex = j;
lastNull = true;
}
}
}
}
else
{
//打印标题
e.Graphics.DrawString(string.Format("{0}", this.printDt.Rows[0][0].ToString()), printFontTitle, printSolidBrush, printMiddle, y + PRINT_TOP_HEIGHT);
}
}
}
catch (Exception ex)
{
MessageBox.Show("打印预览过程中出错,详细:" + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void tBtnPrint_Click(object sender, EventArgs e)
{
printDoc.Print();
}
}
}